我们在vb.net应用程序的一部分中使用Parallel Extensions来从dictonary(string,datatable)中检索数据表。在检索表的方法中,我们使用Monitor.TryEnter。有时,我们会收到错误“从非同步代码块调用对象同步方法”。以下是我们的方法:
Try
if Monitor.TryEnter(_ProductCollection, 200) = true then
_ProductCollection.TryGetValue(name, ReturnValue)
end if
Finally
Monitor.Exit(_ProductCollection)
End Try
在尝试退出之前,我是否应该尝试实现循环以确保获取锁定?我正在考虑错误被抛出,因为我正在尝试执行monitor.exit,即使monitor.tryenter为false。
答案 0 :(得分:3)
Monitor.Exit
来电引发了错误。发生的事情是TryEnter
偶尔超时并且未获取锁定,但始终会调用Monitor.Exit
,因为它是finally
块。那就是问题所在。以下是解决问题的方法。
Dim acquired As Boolean = False
Try
acquired = Monitor.TryEnter(_ProductionCollection, 200)
If acquired Then
' Do your stuff here.
End If
Finally
If acquired Then
Monitor.Exit(_ProductionCollection)
End If
End Try