try to replace
Dispatcher.BeginInvoke(new Action(() =>
Dispatcher.Invoke(new Action(() =>
It should help you with instant form closing.
And to fix InvalidOperationException you should create new instance of Printer every time when you want to show it, or use Hide
method instead of close
But in general it's not realy a good idea to show your from in bw_DoWork method, better place is right before bw.RunWorkerAsync(); method call.