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-然后您需要在问题中告诉我们这一点,并为我们提供更完整的代码部分。