UIスレッドのメソッドのタイムアウト
-
03-07-2019 - |
質問
UIスレッド(WinForms)でオブジェクトをインスタンス化しているという問題があります。 このオブジェクトの作成にはおそらく非常に時間がかかりますが、何らかの「タイムアウト」が必要です。そのメソッドの場合(アプリがブロックされているため)。
私が抱えている問題は次のとおりです。 1.オブジェクトはUIスレッドで作成する必要があります 2.オブジェクトは外部オブジェクトであり、ソースアクセスがないため、変更できません。
だから誰かが創造的なアイデアを持っている場合、タイムアウトに達した場合にメソッドの実行を停止するロジックを作成できるかどうかという質問になりますか?
tia マーティン
解決
これは悪い解決策です。タイマーのワーカースレッドを使用して、UIスレッドを監視します。オブジェクトが作成される前にタイマーが経過した場合、UIスレッドでワーカースレッドに Abort
を呼び出させます。これにより、キャッチする必要があるUIスレッドで ThreadAbortException
が発生します。これが悪い理由は、例外が発生したときの微妙なタイミングと競合状態に応じてプログラムがハングまたはクラッシュする可能性があるためです。
「より安全」なメソッドはワーカーに Interrupt
を呼び出すことです-これはUIスレッドで ThreadInterruptedException
を発生させますが、それは WaitSleepJoin
状態にある場合のみ-スレッドがスリープしない場合、割り込みは発生しませんが、少なくともハングしたりメモリが破損したりすることはありません。
他のヒント
そうではありません。ソースにアクセスできない場合は特に 。
たとえできたとしても、正当な理由なしにコードを強制的に中断することはお勧めできません-問題(リーク、ロックがロックされたままになっているなど)につながる可能性があります。
それは同じ UIスレッドである必要がありますか?このコードを所有する2つ目のUIスレッドを生成できますか?それは little 断片的になりますが、動作します。
BeginInvokeを使用している場合、 IAsyncResult 非UIスレッドからWaitOne(timeout)できる待機ハンドルがあります。
残念ながら、タイムアウト時に、そのBeginInvokeをキャンセルする明確な方法はありません。そのため、 1800 INFORMATION
のソリューションを試すことができます。