假设我有一个IEnumerable,例如List(TValue),并且我想跟踪是否正在访问此列表(以防止在另一个线程上迭代时添加到列表的问题);我总是可以编写如下代码:
Dim List1 As New List(Of Integer)
Dim IteratingList1 As Boolean = False
' ... some code ... '
Private Function getSumOfPositivesFromList1() As Integer
If IteratingList1 Then Return -1
IteratingList1 = True
Dim SumOfPositives As Integer = 0
For Each x As Integer In List1
If x > 0 Then SumOfPositives += x
Next
IteratingList1 = False
Return SumOfPositives
End Function
(我意识到这段代码是很随意的,但是它说明了我在说什么。)
我的问题是,与上述手动更新和访问 bool 值相比,是否有更好/更干净的方法来执行此检查。我觉得一定有,但是据我所知,没有任何IEnumerable类带有内置的“我正在遍历”方法或属性。对我来说,编写一个实现IEnumerable并包含此类属性的新类似乎太过分了。
最佳答案
Afaik,在VB.NET中,可以在访问对象时使用SyncLock
在对象周围放置锁,以防止其他线程同时对其进行处理。
Public Shared objStorageLock As New Object
Private Function getSumOfPositivesFromList1() As Integer
Dim SumOfPositives As Integer = 0
SyncLock objStorageLock
For Each x As Integer In List1
If x > 0 Then SumOfPositives += x
Next
End SyncLock
Return SumOfPositives
End Function
关于vb.net - 有没有一种方法可以检查是否使用For Each循环访问IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/882766/