vb.net - 有没有一种方法可以检查是否使用For Each循环访问IEnumerable?

标签 vb.net multithreading collections ienumerable

假设我有一个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/

相关文章:

.net - VB.NET 代码中的 SQL 查询

python - 在 Python 中设计一个多进程爬虫

scala - 在 Scala 中查找与谓词匹配的项

java - 检查列表是否至少包含一个枚举的最佳方法

java - 在常数时间内按索引从列表中获取多个元素

c# - 如何将C#中的符号“?”转换为vb.net?

vb.net - 向 Telnet 发送命令

.net - 如何在实际绘画之前在光标处显示画笔?

c# - 更改 Thread.Priority 以使程序响应更快

c++ - 为什么GRPC AsyncClient在等待完成队列中的下一个结果时抛出Segfault