1

ソケット サーバーにワーカー スレッドがあります。優先順位を最低に設定すると、すべてが機能しますが、速度は遅くなります。優先度を通常に設定すると、はるかに高速になりますが、作業がなく、アイテムがキュー リストに追加されるかどうかをチェックする while ループに入っている場合でも、CPU の使用率が高くなり、VM の速度が低下します。私はスレッド管理の新人です。Mutex または Monitor を使用して、スレッドをスリープ状態にするか、キューに作業があるまで待機させるにはどうすればよいですか。

m_workerThread = new Thread(new ThreadStart(ProcessQueueLogs));
m_workerThread.Priority = ThreadPriority.Lowest;
m_workerThread.Start();

private void ProcessQueueLogs()
{
    try
    {
        while (!m_stopServer)
        {
            if (m_socketListenersList.Count > 0)
            {
                //Logger.WiteLog("ltsserver getting socketlistener from queue");
                // get the first socket in the list
                LTSSocketListener workerSocket = RequestQueue(null, false);
                //LTSSocketListener workerSocket = (LTSSocketListener)m_socketListenersList[0];

                if (workerSocket != null)
                {
                    // start the socket to process the request
                    workerSocket.StartProcessingRequest();

                    // close the socket
                    workerSocket.CloseSocketListener();

                    //Logger.WriteLog("ltsserver closing socketlistener");

                    // remove of the socket queue list
                    RequestQueue(workerSocket, false);
                    //m_socketListenersList.Remove(workerSocket);
                }
            }
        }
    }
    catch (SocketException e)
    {
        EventLog.WriteEntry(m_eventSource, e.Message.ToString());
        EventLog.WriteEntry(m_eventSource, e.Message.ToString(),               EventLogEntryType.Error, 234);
    }
}

どんな助けでも大歓迎です。

4

2 に答える 2

1

最も簡単な解決策はBlockingCollection、C# 4.0を使用することです。Take()メソッドの呼び出しは、何かがキューに追加されるまでブロックされ、同期プリミティブの使用を完全に回避できます。

于 2012-05-17T16:58:04.847 に答える
0

Monitor.Wait()待ちたい場所でご利用ください。

while (!ThereIsWork)
    Monitor.Wait(_lockerObject);

Monitor.Pulse()orを (別のスレッドで)使用Monitor.PulseAll()して Monitor.Wait を起動し、ThereIsWork状態を再度確認します。

Monitor.Pulse(_lockerObject);

完全な例については、https ://stackoverflow.com/a/530228/102937 を参照してください。

于 2012-05-17T16:57:50.073 に答える