【发布时间】:2013-02-13 18:14:08
【问题描述】:
我有两种方法,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.....
}
问题是我卡住了。我的代码似乎陷入了僵局。
当我查看线程时,我看到按钮单击调用的代码卡在MethodC 中的lock (MyLock),而我的其他线程似乎卡在this.Invoke(del)。
我已经读过从 Lock 中调用方法很危险,但由于我是在那里编写代码的人,即使只有 Thread.Sleep 似乎也会发生这种情况,我认为这不是代码给我惹麻烦了。
为什么 Invoked 方法会停止工作?
是否可能等待methodC 上的锁被释放,然后再返回调用它的原始锁?
【问题讨论】:
-
方法 C 正在等待方法 B 获得的锁,方法 C 无法运行 b4 方法 B。
标签: c# multithreading locking invoke