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
オブジェクトは印刷を拒否します。エラーはありません(明らかです)。プログラムは、プリンターに何も送信されずに終了します。
スレッドを削除すると、プログラムは再び機能します。
私の糸脱毛の知識は弱く、私はほとんど自分自身を教えています-おそらく私は糸脱毛の優先順位がどのように設定されているかを誤解しています。
仕組みは次のとおりです。
- ユーザーはメインフォームで請求書を選択し、印刷することを選択します。
- ユーザーがプログラムを続行している間、バックグラウンドスレッドが消えて印刷されます。
任意のアイデアをいただければ幸いです。