2

別のスレッド (メイン スレッド) から更新される可能性がある間に、(バックグラウンド) スレッドのリストから読み取る必要があります。そのため、元のオブジェクトにアクセスしないように一時的なリストを作成しようとしています。複数の場所で更新が発生する可能性があるため、SyncLock を読み取りロジックに配置すると便利です。それは本質的に間違っていますか?これを正しくロックするためのオプション、またはマルチスレッド状態でリストのアクセス可能なコピーを取得する他の方法は何ですか?

 ' In Main thread: 
 Public SomeList = New List(Of SomeClass) 
 ' ..edit list


 ' In other thread: 
  Dim tempList As List(Of SomeClass)
  SyncLock SomeList
      tempList = SomeList.ToList
  End SyncLock

SomeList.ToListスロー:

ArgumentException、Destination 配列の長さが十分ではありません。destIndex と長さ、および配列の下限を確認してください。

4

2 に答える 2

1

確認した後.ToList、したがって、Reflectorでは、例外はに設定された場所New List(Of SomeClass)(.)から発生している必要があります。is2.CopyTo(Me._items, 0)Me._itemsNew T(count - 1) {}

これは、入力コレクション(にキャストさICollection(Of T)れた)内のアイテムの数が、取得is2後に増加している必要があることを意味します。is2.Count

そのため、削除した回答の前提を再確認します。メインスレッドのすべての場所は、リストを変更するとき' ..edit listにも使用しますか?SyncLock SomeList

于 2012-07-28T13:25:27.787 に答える
0

VB に相当するものが何かわかりませんが、このようなことはできませんか?

IList<string> roDinosaurs = dinosaurs.AsReadOnly();

または

tempList.AddRange(SomeList);
于 2012-07-25T08:33:28.667 に答える