我对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
,直到另一个类迭代完成。
答案 0 :(得分:2)
这不是一个好的设计。列表类本身不是线程安全的,并且没有const概念,因为c ++中存在,因此任何线程的任何用户都可以尝试添加到列表中。一个简单的解决方案是使用一个线程安全集合,如BlockingCollection。如果没有套件,您可以使用自定义枚举器提供自己的自定义类,以观察锁定。