7

私はこのコードを実行していますが、ほとんど何もしていないにもかかわらず、かなりの量の CPU を使用しています。

while (this.IsListening)
{
    while (this.RecievedMessageBuffer.Count > 0)
    {
        lock (this.RecievedMessageBuffer)
        {
            this.RecievedMessageBuffer[0].Reconstruct();
            this.RecievedMessageBuffer[0].HandleMessage(messageHandler);
            this.RecievedMessageBuffer.RemoveAt(0);
        }
    }
}

条件が満たされるまでブロックする最善の方法は何ですか?

4

3 に答える 3

10

を使用しWaitHandleます。

WaitHandle waitHandle = new AutoResetEvent();

// In your thread.
waitHandle.WaitOne();

// In another thread signal that the condition is met.
waitHandle.Set();

クラスのインターフェースを変更して、読み取る新しいデータがあるときにイベントを発生させることも検討できます。次に、コードをイベント ハンドラー内に配置できます。

于 2012-06-11T05:14:51.683 に答える
7

RecievedMessageBuffer.NET 4 を使用していると仮定すると、BlockingCollectionに切り替えることをお勧めします。メッセージを入れるときは、Addメソッドを呼び出します。メッセージを取得する場合は、TakeまたはTryTakeメソッドを呼び出します。Take は、元の例のように CPU を消費することなく、メッセージが利用可能になるまで読み取りスレッドをブロックします。

// Somewhere else
BlockingCollection<SomethingLikeAMessage> RecievedMessageBuffer = new BlockingCollection<SomethingLikeAMessage>();


// Something like this where your example was
while (this.IsListening)
{
    SomethingLikeAMessage message;
    if (RecievedMessageBuffer.TryTake(out message, 5000);
    {
        message.Reconstruct();
        message.HandleMessage(messageHandler);
    }
}
于 2012-06-11T05:20:23.620 に答える