2013-06-10 2 views
1

Я сделал TCP-сервер в C# (как службу Windows), который основан в основном на образце Asynchronous Server Socket code в MSDN. Однако примерно через пару дней он начинает использовать 100% CPU на машине dev и остается там до тех пор, пока я не остановлю и не перезагружу службу. Странно, что он по-прежнему работает правильно, даже когда служба достигает максимального использования ЦП, поэтому функциональность никогда не является проблемой.Как устранить проблему 100% -ного использования ЦП с помощью TCP-сервера?

Я спросил об этом на StackOverflow здесь - http://goo.gl/XB2C5, но, я думаю, не было очевидных проблем с кодом, который я вставил. Я отслеживал количество потоков, которые использует программа, и всегда между 14-17, поэтому я не думаю, что это проблема.

Теперь я немного застрял и не знаю, как устранить эту проблему. Есть ли какие-либо инструменты, которые я мог бы использовать или более диагностический код, который я мог бы добавить, чтобы узнать, что вызывает использование ЦП? Мне просто нужно некоторое руководство по дальнейшему исследованию проблемы.

Любая помощь была бы принята с благодарностью. Благодаря!

+1

Одним из инструментов является Process Monitor. Если вам удастся правильно настроить символы, это может дать довольно много интересной информации о том, что происходит в вашем стеке программы. Если вы никогда раньше не использовали Process Monitor, есть серия видео, объясняющая, как ее использовать: http://technet.microsoft.com/en-us/sysinternals/bb963887.aspx – Giedrius

ответ

0

Если вы добавите Thread.Sleep() в конец следующего цикла, это остановит 100% -ный процессор?

while (true) 
{ 
    // Set the event to nonsignaled state. 
    allDone.Reset();      

    // Start an asynchronous socket to listen for connections. 
    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); 

    // Wait until a connection is made before continuing. 
    allDone.WaitOne(); 

    Thread.Sleep() //This makes the thread wait for its next timeslice 
    //Thread.Yield() //This makes the thread wait on another change to run from the OS wich might be much faster then Thread.Sleep(). 
} 
+0

Я обязательно попробую это. Итак, спустите основной поток сразу после того, как он получит событие Set из другого потока, так что перед тем, как флаг будет сброшен? – Sundance

+1

Другие варианты серьезно отлаживают код, запустив его в профилировщике. Профайлер ANTS имеет бесплатные трейлы, а некоторые версии VS.net имеют встроенный профайлер. Другими параметрами являются просто нажатие кнопки паузы при отладке, чтобы найти, куда указывает текущий указатель выполнения. – CodingBarfield