Print() メソッドがWPFとWinFormsでハングする
WPFやWinFormsアプリケーションで同期Print()メソッドを呼び出すと、メソッドは呼び出されますが、完了しません。 呼び出しは無期限にハングし、スレッドをブロックし、印刷ジョブ自体が有効であってもUIがフリーズします。
var printer = new IronPrint.Printer();
printer.Print("Test print"); // Hangs here
var printer = new IronPrint.Printer();
printer.Print("Test print"); // Hangs here
Dim printer As New IronPrint.Printer()
printer.Print("Test print") ' Hangs here
これは想定される動作です。 同期Print()はアプリケーションのUIスレッドで実行され、そこでWPFのディスパッチャーとスレッドコンテキストがIronPrintの印刷パイプラインと衝突し、呼び出しをブロックします。
解決策
同期メソッドの代わりに非同期APIを呼び出します。
var printer = new IronPrint.Printer();
await printer.PrintAsync("Test print");
var printer = new IronPrint.Printer();
await printer.PrintAsync("Test print");
Dim printer = New IronPrint.Printer()
Await printer.PrintAsync("Test print")
PrintAsync()は印刷操作をブロックパスから移し、ジョブが完了し、WPFとWinFormsの両方でUIが応答し続けるようにします。
ベストプラクティス
- IronPrintを更新する: 利用可能な修正を取り入れるため最新バージョンを実行します。
- 非同期APIを推奨: WPFやWinFormsでUIスレッドのデッドロックを避けるために
PrintAsync()を利用してください。 - メインスレッドをブロックしない: 非同期呼び出しに対して
.Wait()を避けてください。 - 長時間実行されるI/Oを外部に委譲する: 印刷やその他の外部の作業をバックグラウンドまたは非同期タスクに保ちます。

