2

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

lock(objLocker)
{

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

                    }
}
4

2 回答 2

7

如果这是您唯一要保护的东西,那将是多余的;没有必要lockfor BeginInvoke。实际上,如果是,那将是非常有害Invoke的,并且名为 (the // ..code..)的方法试图锁定objLocker- 你会自己死锁。目前,它没有任何用处,并且有可能对 3 个维护版本造成伤害。在更一般的情况下,如果有需要保护东西,我会将这两个任务分开,即

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

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

于 2012-10-12T09:43:29.370 回答
3

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

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

myDispatchder.BeginInvoke(
    System.Windows.Threading.DispatcherPriority.Render,
    new Action(() =>
    {
        lock(objLocker)
        {
            // ..code..
        }
    }));
于 2012-10-12T10:05:38.060 回答