2009-05-04 9 views
1

UIスレッド(WinForms)でオブジェクトをインスタンス化しているという問題があります。 このオブジェクトの作成には、おそらく非常に時間がかかり、そのメソッドの「タイムアウト」(私のアプリケーションをブロックしているため)があります。UIスレッドのメソッドのタイムアウト

私は持っている問題は: 1.オブジェクトはUIスレッド に作成する必要があります。オブジェクトは外部オブジェクトであり、ソースアクセスがないため変更できません。

誰かが創造的なアイデアを持っているなら、タイムアウトに達した場合に実行されたメソッドを停止させるロジックを作成することができますか?ここで

TIA マーティン

答えて

1

は悪いソリューションです。タイマーのワーカースレッドを使用して、UIスレッドを監視します。オブジェクトが作成される前にタイマーが経過すると、ワーカースレッドはUIスレッドでAbortを呼び出します。これにより、捕捉しなければならないUIスレッドでThreadAbortExceptionが発生します。これが悪い理由は、例外が発生したときの微妙なタイミングと競合状態によって、プログラムがハングしたりクラッシュしたりする可能性があるからです。

「安全な」方法は、労働者のコールInterruptを持つことである - これは、UIスレッドでThreadInterruptedExceptionを発生させますが、それはWaitSleepJoin状態にあるときにのみ - スレッドは眠らない場合、それは、少なくとも中断しませんが、メモリをハングアップしたり、破損したりすることはありません。

0

ソースにアクセスできない場合は、特に

たとえ可能であっても、正当な理由なしにコードを強制的に中断することはお勧めできません。それは問題(リーク、ロックがロックされたままになるなど)につながるだけです。

同じ UIスレッドである必要がありますか?このコードを所有するために2番目のUIスレッドを生成できますか? 少しが駄目ですが、動作します。

0

BeginInvokeを使用している場合は、IAsyncResultにはWaitOne(タイムアウト)が可能な待機ハンドルがUI以外のスレッドからあります。

残念ながら、タイムアウトすると、そのBeginInvokeをキャンセルするクリーンな方法はありません。だから、1800 INFORMATIONの解決策を試してみてください。