3

C#で並行コレクションを取得する方法、または少なくとも並行列挙子をサポートするコレクションを取得する方法を探しています。現在、反復しているコレクションが変更されたときに取得しています。 InvalidOperationException

コレクションをディープ コピーしてプライベート コピーを操作することもできますが、もっと良い方法があるのではないかと考えています。

コードスニペット:

foreach (String s in (List<String>) callingForm.Invoke(callingForm.delegateGetKillStrings))
{
    //do some jazz
}

- 編集 -

私は答えを取りましたが、コレクションに書き込んでいたコードもロックを取得しようとする必要があることを確認する必要があることもわかりました。

private void addKillString(String s)
{
    lock (killStrings)
    {
        killStrings.Add(s);
    }
}
4

3 に答える 3

5

ディープ コピーを行う以外に、コレクションをロックするのが最善の策かもしれません。

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }
于 2008-09-02T03:25:49.087 に答える
4

ですから、あなたが何を求めているのかよくわかりませんが、Parallel Extensions チームは、法案に合うかもしれないいくつかのものをまとめました. 特に、並列コレクションの列挙に関するこのブログ投稿を参照してください。また、Parallel CTP をダウンロードするためのリンクも含まれています。もちろん、残りのブログ投稿を参照して、CTP の目的とプログラミング モデルのしくみを理解することもできます。

于 2008-09-02T03:27:42.810 に答える
1

FCL コレクションを使用する場合、重複する可能性のある複数のスレッドからの反復/変更をサポートする唯一の方法はロックです。

ただし、ロック オブジェクトとして何を使用するかに注意してください。SyncRoot の使用は、コレクション自体がそれを使用するクラスのプライベート メンバーである場合にのみ有効です。コレクションが保護されているか公開されている場合、クラスのクライアントは SyncRoot で独自のロックを取得でき、クラス内のコードでデッドロックが発生する可能性があります。

サードパーティのコレクション ライブラリに興味がある場合は、優れたC5 Generic Collection Libraryをお勧めします。それらには、ロックせずに簡単かつ安全に変更および反復できるツリーベースのコレクションのファミリがあります。詳細については、(優れた) ドキュメントのセクション 8.10 および 9.11 を参照してください。

于 2008-09-02T14:30:01.827 に答える