シングルスレッドで実行する場合は、最近のデータ線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を{取得します。セットする; } } }