2012-05-17 30 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()方法將阻塞,直到已將某些內容添加到隊列中,讓您避免使用同步完整的原語。