ConcurrentQueue <T>キューのスレッドの安全性

  シングルスレッドで実行する場合は、最近のデータ線600ワットについては、小規模なプロジェクトに取り組んで、データが伴うデータの量に、洗浄されるべきは、低効率につながる唯一のマルチスレッド、マルチスレッド存在しますが、スレッドセーフを使用することができ、大きすぎます問題は、その後、データをチェックし、そこConcurrentQueue <T>データ構造というのが私の現在の問題に最適な解決策を見つけました。

     撮影したそのスレッドセーフな先入れ先出し(FIFO)コレクション:MSDNから上に説明しました。

       私たちはそれについて話してみましょう:( MSDNから簡単な使い方)

  1.Enqueue(T)端ConcurrentQueue <T>のにオブジェクトを追加します。

  2.TryDequeue(T)との同時キューの先頭にあるオブジェクトを削除しようとする試みを返します。

  <T>の要素が含まれている数3.Count ConcurrentQueueを取得

  4.IsEmptyはConcurrentQueue <T>を示す値を取得し、空です。

     ここでは最も簡単な方法(プロデューサ/コンシューマモデル)を使用して、小規模なプロジェクトの実施は、データが最初のキューに書き込まれている、そして消費者による消費は、次の学習のために、私は小さなデモを書いたものです、間違った場所には、展示をしてください!

    

システムを使用しました。
System.Collections.Concurrentを使用しました。
System.Threadingを使用しました。
System.Threading.Tasksを使用しました。

名前空間ThreadCQueue 
{ 
    クラスプログラム
    { 
        静的な無効メイン(文字列[] args)
        { 
            タスクT = RunProgram()。
            t.Wait(); 
            Console.WriteLineを( "OK"); 
            Console.ReadKey(); 
        } 

        タスクRunProgram()非同期静的
        { 
            VARタスクキュー=新しいConcurrentQueue <CustomTask>(); 
            //生产
            VAR taskSource = Task.Run(()=> TaskProducer(タスクキュー))。
            taskSourceのawait;
            //消费者 
            VARプロセッサ=新しいタスク[4]。
            ため(VAR iが= 1; I <= 4; I ++)
            { 
                ストリングprocessordId = i.ToString()。
                プロセッサ[I - 1] = Task.Run(()=> TaskProcessor(タスクキュー、$ "プロセッサ{processordId}")); 
            } 
            Task.WhenAll(プロセッサ)を待ちます。
        } 
        タスクTaskProducer非同期静的(ConcurrentQueue <CustomTask>キュー)
        { 
            ためには、(varがI = 1; I <= 20; I ++)
            { 
                のawait Task.Delay(50)。
                VARのworkItem =新しいCustomTask {ID = I}。
                queue.Enqueue(のworkItem)。
            }
        } 
        静的非同期タスクTaskProcessor(ConcurrentQueue <CustomTask>キュー、文字列名)
        { 
            CustomTaskのworkItem。
            await GetRandomDelay()。
            一方、(queue.TryDequeue()のworkItemアウト)
            { 
                Console.WriteLineを($ "消费{workItem.Id} ===> {名前}")。
                await GetRandomDelay()。
            } 
        } 

        静的タスクGetRandomDelay()
        { 
            int型遅延=新しいランダム(DateTime.Now.Millisecond).Next(1、500)。
            リターンTask.Delay(遅延); 
        } 
    } 
    クラスCustomTask 
    {
        公共のint Idを{取得します。セットする; }  
    }
}

  

おすすめ

転載: www.cnblogs.com/SmallHan/p/11874867.html