2012-05-17 3 views
1

У меня есть рабочий поток на моем сервере сокетов. Когда я устанавливаю самый низкий приоритет, все работает, но оно медленное. Когда я устанавливаю приоритет Normal, он намного быстрее, но когда нет работы, и в цикле while проверяется, что элемент должен быть добавлен в список очередей, он все еще запускает cpu-usuage, и моя VM замедляется. Я новичок в управлении потоками. Как использовать Mutex или Monitor, чтобы сделать поток спящим или ждать, пока в очереди не будет работы.C# Thread Sleep или Wait до работы 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

Простейшим решением было бы использовать BlockingCollection из C# 4.0: вызовы метода Take() блокируются до тех пор, пока в очередь не будет добавлено что-то, что позволит избежать использования синхронизации все примитивные примитивы.