3

私は .NET/Threads の初心者で、この演習で誰かが私を助けてくれるかどうか知りたいです。スレッドをロックせずに機能させるには、コメントを置き換える必要があります。

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);

4

1 に答える 1

1

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

.NET のドキュメント、ここのスタック オーバーフロー、およびその他の場所には、多くの例があります。私の記事が役立つかもしれません: http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

于 2011-12-27T00:59:39.660 に答える