63

次のメソッドを持つクラスがあります。

public List<Bike> bikesCopy 
{
     get 
     { 
       List<Bike> bs;
       lock (_bikes) bs = new List<Bike>(_bikes);
       return bs;
     }
}

別のリストのコピーを作成し、private List<Bike> _bikes;

奇妙なことに、次のエラーが表示されます。

宛先配列の長さが不十分です。destIndex と長さ、および配列の下限を確認してください。

ここで何が問題なのですか?

4

4 に答える 4

112

エラーは、オブジェクト_bikesがスレッドセーフではないことにあると言えます。コメントしたように、どこかにロックされていない_bikesオブジェクトの変更があります。

これは、 _bikesのサイズが測定されたときに、変数bsがサイズXに設定されている一瞬のエラーです。リストがいっぱいになる次の瞬間に、_bikesオブジェクトのサイズが大きくなり、エラーが発生します。

だからあなたのコードを調べてください。_bikesオブジェクトのすべての参照を検索し、それらがスレッドセーフに処理されていることを確認します(ロック付き)。

于 2013-01-02T08:23:36.370 に答える
6

さて、あなたは試すことができます:

using System.Linq; //ToList() is an extension function defined here
...
lock(_bikes)
    return _bikes.ToList();

例外の詳細については、次のセクションで説明します:特定のケースで foreach ループが機能しないのはなぜですか?

于 2012-04-28T08:59:57.920 に答える