我有两种方法,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)
.
我已经读过从 a 中调用方法很危险,Lock
但是因为我是在那里编写代码的人,即使只使用 a 似乎也会发生这种情况,Thread.Sleep
我认为这不是让我陷入困境的代码。
为什么 Invoked 方法会停止工作?methodC
在返回调用它的原始锁之前是否可能等待释放锁?