C# 多线程:在lock语句中使用BeginInvoke ok?

C# 多线程:在lock语句中使用BeginInvoke ok?,c#,multithreading,C#,Multithreading,在锁构造中使用异步操作是一种良好的编程实践。例如 lock(objLocker) { myDispatchder.BeginInvoke( System.Windows.Threading.DispatcherPriority.Render, new Action(() => { // ..code.. } } 如果这是你

在锁构造中使用异步操作是一种良好的编程实践。例如

lock(objLocker)
{

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

                    }
}
如果这是你唯一要保护的东西,那么它将是多余的;无需为
BeginInvoke
锁定
。实际上,如果这是
调用
,并且调用的方法(
/..code..
)也试图锁定
objLocker
,那将是非常有害的-您将使自己死锁。目前,它没有任何用处,并且有可能导致3次维护释放。在更一般的情况下,如果有需要保护的东西,我会将这两项任务分开,即

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

这样就避免了以后可能出现的任何问题。

锁中的异步操作只会无缘无故地使代码更加复杂,并引入可能的死锁

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

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

没关系,但不会像您正在使用的那样在表单中显示任何内容。@Justin我不知道,谢谢。您需要让我们知道您试图在代码中控制对哪些内容的访问。当前的代码没有告诉我们太多。我试图理解一个已经编写好的代码,它只是使用begininvoe inside lock()@user1527958-然后您需要在问题中告诉我们这一点,并为我们提供更完整的代码部分。