C#Thread Sleep或Wait,直到有MUTEX或MONITOR工作

时间:2012-05-17 16:53:27

标签: c#

我的套接字服务器中有一个工作线程。当我设置为最低优先级时,一切都可以找到,但速度很慢。当我将优先级设置为Normal时,速度要快得多,但是如果没有工作并且在while循环中检查要添加到队列列表中的项目,它仍然会占用cpu使用量并且我的VM会变慢。我是线程管理的新手。如何使用互斥锁或监视器使线程休眠或等待队列中的工作。

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

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是使用C#4.0的BlockingCollection:对Take()方法的调用将阻塞,直到将某些内容添加到队列中,让您完全避免使用同步原语。

答案 1 :(得分:0)

在您想要等待的地方使用Monitor.Wait()

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

在别处(在另一个线程上)使用Monitor.Pulse()Monitor.PulseAll()来唤醒Monitor.Wait,然后再次检查ThereIsWork条件:

Monitor.Pulse(_lockerObject);

请点击此处查看完整示例:https://stackoverflow.com/a/530228/102937