2012-05-17 28 views
1

我的套接字服务器中有一个工作线程。当我设置为最低优先级时,一切都可以找到,但速度很慢。当我将优先级设置为Normal时,速度要快得多,但是当没有工作并且处于while循环检查要添加到队列列表中的项目时,它仍然占用了CPU CPU,并且VM速度变慢。我是一个新的线程管理。如何使用互斥锁或监视器使线程休眠或等待队列中有工作。C#线程休眠或等待,直到有工作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); 
    } 
} 

任何帮助表示赞赏。

回答

0

使用Monitor.Wait()要等待的位置。

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

使用Monitor.Pulse()Monitor.PulseAll()其他地方(在另一个线程)唤醒Monitor.Wait,并再次检查ThereIsWork条件:

Monitor.Pulse(_lockerObject); 

在这里看到一个完整的例子:https://stackoverflow.com/a/530228/102937

1

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