1

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

私が抱えている問題は次のとおりです。1. オブジェクトは UI スレッドで作成する必要があります。2. オブジェクトは外部オブジェクトであり、ソース アクセス権がないため、変更できません。

だから私の質問は、誰かが創造的なアイデアを持っている場合、タイムアウトに達した場合に実行されたメソッドを停止するロジックを作成できるかどうかです。

ティア・マーティン

4

3 に答える 3

1

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

「より安全な」方法は、ワーカーを呼び出すことですInterrupt-これはThreadInterruptedExceptionUIスレッドで発生しますが、それがWaitSleepJoin状態にある場合にのみ-スレッドがスリープしない場合は中断しませんが、少なくともハングしたり破損したりしません記憶か。

于 2009-05-04T09:51:30.320 に答える
0

あまり; 特にソースにアクセスできない場合。

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

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

于 2009-05-04T09:53:05.607 に答える
0

BeginInvokeを使用している場合、IAsyncResultには、UI以外のスレッドからWaitOne(timeout)できる待機ハンドルがあります。

残念ながら、タイムアウト時には、BeginInvokeをキャンセルするクリーンな方法はありません。そのため、1800 INFORMATIONのソリューションを試すことができます。

于 2009-05-04T09:55:01.140 に答える