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

私の質問は、Forブロック全体で mySubmissionList が同期されるかどうかです。基本的に、他のクラスの反復が完了するまで、私はmySubmissionList使用されたくありません。AddSubmission

4

1 に答える 1

2

これは良い設計ではありません。リスト クラス自体はスレッド セーフではなく、c++ にあるような const の概念がないため、任意のスレッドのユーザーがリストに追加しようとする可能性があります。簡単な解決策は、 BlockingCollectionのようなスレッド セーフなコレクションの 1 つを使用することです。それがうまくいかない場合は、ロックを監視するカスタム列挙子を独自のカスタム クラスに提供できます。

于 2013-05-21T21:36:15.220 に答える