0

我对 VB.NET 中的线程同步有疑问。

假设您有一个列表对象作为私有类成员并将其公开为只读属性(注意Get块中的同步):

Dim mySubmissionList As New List(Of Submission)

ReadOnly Property SubmissionList() As List(Of Submission)
  Get
    SyncLock mySubmissionList
      Return mySubmissionList
    End SyncLock
  End Get
End Property

在该类的另一个方法中,列表将被添加到:

Public Sub AddSubmission(ByRef submsn As Submission)
  SyncLock mySubmissionList
    mySubmissionList.Add(submsn)
  End SyncLock
End Sub

现在,假设您在另一个类中使用此属性,如下所示:

' CurrentSubmissions is an object of the class discussed above
For Each submsn In CurrentSubmissions.SubmissionList
  ' use submsn here...
Next

我的问题是,mySubmissionList 会在整个For区块中同步吗?基本上,在其他类完成迭代之前,我不想mySubmissionList被使用。AddSubmission

4

1 回答 1

2

这不是一个好的设计。列表类本身不是线程安全的,并且没有 c++ 中的 const 概念,因此任何线程的任何用户都可以尝试添加到您的列表中。一个简单的解决方案是使用其中一个线程安全集合,例如BlockingCollection。如果这不适合,您可以为您自己的自定义类提供一个自定义枚举器来观察您的锁。

于 2013-05-21T21:36:15.220 回答