私には2つの方法がありMethodA
ますMethodB
。MethodB
UIスレッドで実行する必要があります。私はそれらの間を実行することを許可せずに次々に実行する必要がありMethodC
ます。
MethodC
ユーザーが素敵な小さなボタンをクリックすると呼び出されます。
これを確実にするために私がしたことは、このLock
ようにコードの周りに置かれます:
lock (MyLock)
{
MethodA(param1, param2);
MyDelegate del = new MyDelegate(MethodB);
if (this.IsHandleCreated) this.Invoke(del);
}
そしてのためにMethodC
:
public void MethodC()
lock (MyLock)
{
Do bewildering stuff.....
}
問題は私が立ち往生していることです。コードがデッドロックに陥っているようです。
スレッドを見ると、ボタンのクリックによって呼び出されたコードがスタックしlock (MyLock)
てMethodC
いて、他のスレッドがでスタックしているように見えthis.Invoke(del)
ます。
内からメソッドを呼び出すのは危険だと読んだのLock
ですが、そこにコードを書いたのはThread.Sleep
私なので、これは私を困らせているのはコードではないと思っただけでも起こるようです。
Invokedメソッドが機能しなくなるのはなぜですか?ロックが解除されるのを待ってmethodC
から、元のロックに戻る可能性がありますか?