多线程:在锁定语句里面使用BeginInvoke好吗?

时间:2012-10-12 09:40:58

标签: c# multithreading

在锁构造中使用异步操作是一种很好的编程习惯吗?例如,

lock(objLocker)
{

    myDispatchder.BeginInvoke(
        System.Windows.Threading.DispatcherPriority.Render,
        new Action(() =>
                    {
                      // ..code..

                    }
}

2 个答案:

答案 0 :(得分:7)

如果那是您正在保护的唯一事物,那么它将是多余的;对于lockBeginInvoke无需Invoke。实际上,如果那是// ..code..,那将非常有害,并且调用的方法(objLocker试图锁定{ {1}} - 你会陷入僵局。目前,它没有任何用处,并且可能性会造成伤害3维护释放。在更一般的情况下,如果需要保护的东西,我会将这两个任务分开,即

lock(objLocker)
{
    // do some stuff
}
myDispatcher.BeginInvoke(...);

这样可以避免以后出现任何潜在问题。

答案 1 :(得分:2)

lock中的异步操作除了使代码更加复杂,并且引入可能的死锁之外什么都不做。

给出你的代码示例我可以建议以下内容可能更有用:

myDispatchder.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.Render,
    new Action(() =>
    {
        lock(objLocker)
        {
            // ..code..
        }
    }));