で起動我々は、ダイアログや他のユーザーとの対話をポップする必要がバックグラウンドスレッドで実行されているいくつかのコードを持っているので、我々は、UIスレッドへの通常のInvoke
呼び出しを実行します。タイムアウト
Control.Invoke(SomeFunction);
void SomeFunction()
{
...
}
をしかし、我々 UIスレッドがInvoke
呼び出しに即座に応答しないことがあるため、UIスレッドが現在、まだ返されていなかったクロスプロセスDCOM呼び出しを実行していたことがわかりました。 DCOMコールが戻ってくると、私たちの機能は呼び出されましたが、それまではInvoke
コールがハングアップしたように見えました。
:
ManualResetEvent invokeEvent = new ManualResetEvent();
var result = Control.BeginInvoke(SomeFunction, invokeEvent);
if (!invokeEvent.WaitOne(1000))
throw new Exception("Not responding");
Control.EndInvoke(result);
void SomeFunction(ManualResetEvent invokeEvent)
{
invokeEvent.Set();
...
}
これは、「私のマシンの感覚の作品」で働いていたが、それは欠陥の数を持っていました。
http://www.codinghorror.com/blog/images/works-on-my-machine-stamped.png
- は、まず機能はまだタイムアウトが発生した場合でも、呼び出される - DCOMの呼び出しが実際に完全にハングアップしていなかったならば、それは最終的に第二
- 実行され、明白な恐ろしいレースがあります条件
- 最後に、最初の二つのことが解決できたとしても、全体のこと
の全体の「Arrgh」-nessがあり、我々はまだ世代を持っていますまあまあ。これを解決する良い方法はありますか?
私たちはクロスプロセスDCOM呼び出しを行うコードを所有していないと申し訳ありません。たとえそうしたとしても、これを一般的な問題として解決する必要があります。これは、この一般的な問題の原因となる他のコードがロードされる可能性があります。良いアイデア –