我正在尝试创建生成 HTML 发票并将其发送打印的 GUI 程序。
我有这个工作。但是,现在我想介绍线程。
我有一个带有BackgroundWorker
. 后台工作人员运行以下代码:
#region BackGroundWorker
private void bg_htmlGeneration_DoWork(object sender, DoWorkEventArgs e)
{
//SOME MORE CODE..
foreach (XElement ele in Lib.GetInvoiceElement(inv, ico.Supplier))
{
PrintDocument(Lib.CreateHTMLFile());
}
}
#endregion
public void PrintDocument(string fileName)
{
var th = new Thread(() =>
{
WebBrowser webBrowserForPrinting = new WebBrowser();
webBrowserForPrinting.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(PrintDocumentHandler);
webBrowserForPrinting.Url = new Uri(fileName);
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
public void PrintDocumentHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
{
((WebBrowser)sender).Print();
((WebBrowser)sender).Dispose();
Application.ExitThread();
}
一切顺利。但是,该WebBrowser
对象拒绝打印。没有错误(很明显),程序结束时没有任何内容发送到打印机。
当我拿走线程时,程序再次运行。
我对线程的了解很薄弱,而且我几乎是在自学——所以大概我误解了线程优先级是如何设置的。
这是它应该如何工作的:
- 用户在主窗体上选择发票,选择打印。
- 当用户继续使用程序时,后台线程会消失并打印它们。
任何想法,将不胜感激。