2011-12-27 12 views
3

私は.NET/Threadsで新しく、この演習で誰かが私を助けることができるかどうかを知りたいと思います。私はそれがスレッドをロックせずに動作させるために、コメントを交換する必要があります。.NETコンシューマ/プロデューサ(キュー)

private Queue<int> queue; 

public void ConsumeFunc(){ 
    while (true){ 
     // 1 
     while (/* 2 */){ 
     // 3 
     } 
     int element = queue.Dequeue(); 
     // 4 
     Console.WriteLine("Consume element: " + element); 
     Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000); 
    } 
} 

private void ProduceFunc(){ 
    while (true) { 
     // 1 
     queue.Enqueue(DateTime.Now.Millisecond); 
     // 2 
     // 3 
     Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000); 
    } 
} 

私はこれを管理しますが、それは

public void ConsumerFunc(){ 
    while (true){ 
     Monitor.PulseAll(queue); // 1 
     while (queue.Count == 0){ /* 2 */ 
      Monitor.Wait(queue); // 3 
     } 
     int element = queue.Dequeue(); 
     lock (queue) // 4 
     Console.WriteLine("Consume element: " + element); 
     Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 2) * 1000); 
    } 
} 


public void ProducerFunc(){ 
    while (true) { 
     lock (queue) // 1 
     queue.Enqueue(DateTime.Now.Millisecond); 
     Monitor.PulseAll(queue); // 2 
     // 3 ??? 
     Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(0, 3) * 1000); 
    } 
} 

を完了し、次のエラー与えていない: オブジェクトの同期方法を非同期コードブロックから呼び出された, オンMonitor.PulseAll(queue);

+0

+1あなたの助けを求める前に問題を解決しようとする試み。本当にきちんと質問されました! –

答えて

1

むしろthaあなた自身が同期を実装するために戦うnは、BlockingCollectionを見てください。すべての同期を処理し、QueueクラスとMonitorクラスを使用して作成できるものよりも優れたパフォーマンスを発揮します。

.NETのドキュメントには、スタックオーバーフローなど、さまざまな例があります。私の記事が役に立ちます:http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

+0

目的がキューを構築することであれば、ConcurrentQueueを使用することもできます。http://msdn.microsoft.com/en-us/library/dd267265.aspx – Mathias

+0

@Mathias: 'BlockingCollection'は、デフォルトでは、バッキングストアとして 'ConcurrentQueue'を使用します。私は 'ConcurrentQueue'を単独で使うほうが良い場合はまだ実行していません。 –

関連する問題