0

さまざまなスレッドからのコレクション (この場合はキュー) を使用するアプリケーションがあります。オブジェクトはあるスレッドでキューに入れられ、別のスレッドでは別のオブジェクトがキューから取り出されます。

これらのアクションは同時に発生する可能性があり、コレクション カウンターが再定義されているときに、引数の範囲外例外などの例外で解決されます。

私は「見栄えの良い」ものと、これらのアクションを互いに除外する正しい理由を探しています。

  1. 「見栄えが良い」とは、ロック(オブジェクト)メカニズムを含むこのコレクションから派生した独自のコレクションを作成したくないということです

  2. 私が持っていたブレーンストーミングのアイデアは使いたくありません。これはかなり「醜い」ものです。

    enqueueOk = false;
    while (!enqueueOk)
    {
           try
           {
               Qsockets.Enqueue(currentSoc);
               enqueueOk = true;
           }
           catch { } 
    }

もちろん、ロックまたはミューテックスを使用することを考えましたが、それは、これらのアクションを各スレッドから呼び出されるプロシージャにラップし、エンキューまたはデキューすることを決定した場合にのみ当てはまり、これも長くて「醜い」ものになります。

編集:
誰も私の答えを下に見ていないようだから

コレクション自体にロック機構を使用しました

lock(Qsockets)
{
   Qsockets.Enqueue(currentSoc); 
}
4

7 に答える 7

1

TPLは使えますか?ConcurrentQueue は、並行アクティビティを自動的に処理します。

http://msdn.microsoft.com/en-us/library/dd267265.aspx

于 2011-03-28T20:16:44.323 に答える
1

.Net 4 がオプションである場合、常に .Net 4 のConcurrentQueueクラスがあります。クラス内にロックを実装します。

于 2011-03-28T20:19:37.380 に答える
1

Concurrent QueueまたはSynchronize the queueを使用できます。

于 2011-03-28T20:20:06.800 に答える
1

ConcurrentQueue を使用します (4.0 で使用可能)。http://msdn.microsoft.com/en-us/library/dd267265.aspxを参照してください。

于 2011-03-28T20:21:25.160 に答える
0

私はバイト単位の投稿から、実際のコレクションをロックできると結論付けました

lock(Qsockets){Qsockets.Enqueue(currentSoc); }

于 2011-03-28T22:26:49.813 に答える
0

古典的な生産者と消費者のシナリオのようです。この素敵なを確認しましたか?

于 2011-03-28T20:18:04.840 に答える
0

lock ステートメントは、これらを処理するための頼りになる方法であり、.NET Framework に組み込まれた "スレッド セーフ" コレクションはそれらに依存しています。早くやれよ。

于 2011-03-28T20:18:10.717 に答える