Monitor.TryEnter建议

时间:2010-07-30 05:08:06

标签: .net multithreading

我们在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。

1 个答案:

答案 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