在锁构造中使用异步操作是一种很好的编程习惯吗?例如,
lock(objLocker)
{
myDispatchder.BeginInvoke(
System.Windows.Threading.DispatcherPriority.Render,
new Action(() =>
{
// ..code..
}
}
答案 0 :(得分:7)
如果那是您正在保护的唯一事物,那么它将是多余的;对于lock
,BeginInvoke
无需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..
}
}));