2010-08-19 5 views
2

Я надеюсь, что кто-то может пролить свет на то, что может произойти для меня. Вот краткое изложение того, что происходит.Задержка таймера Ухудшается или становится несогласованным с течением времени?

У меня есть приложение, которое делает много «вещей». Это довольно мощное приложение, которое делает множество номеров хрустом, используя множество потоков. Используется несколько таймеров. В течение длительного периода времени таймеры перестают последовательно ссылаться на прошедший обработчик.

Например: у меня есть таймер, установленный каждый раз. Через несколько часов таймер начинает беспорядочно запускать поздно. Если я не перезагружаю приложение, производительность просто ухудшается, а таймеры запускаются позже и позже, в конечном итоге, превращаясь в 3 или 4 секунды, заставляя меня перезапустить приложение. Я не смог идентифицировать утечки. Использование ЦП не увеличивается, память не растет, и сервер не находится рядом с максимальным. Может ли кто-нибудь дать мне некоторые идеи относительно того, что может быть причиной этого?

private void Timer_Elapsed(object source, ElapsedEventArgs e) 
{ 
    if (seconds > 0) 
    { 
     seconds--; 

     timer.Start(); 
    } 
} 
+0

Использование памяти не происходит вообще? Моим первым подозреваемым в этом виде проблемы будет сбор мусора ... –

+0

Не быть слишком педантичным, но нет такой вещи, как «Таймер C#». Это таймер .NET, и вы, кажется, пишете на C#. –

+2

Похоже, ваша система работает все быстрее и быстрее, поэтому время фактически замедляется.Попробуйте отцепить вечный двигатель. – womp

ответ

0

Похоже, что на самом деле это не тот же самый таймер, поэтому здесь «утечка» ресурсов - это ручки GDI.

+0

... легко проверяется через диспетчер задач. –

5

Возможно ли, что вы исчерпаете пул потоков? Большинство таймеров вызывают обработчик, используя поток threadpool. Если задействованы все потоки threadpool, они просто будут стоять в очереди до тех пор, пока они не будут доступны.

Если это случай, переключите часть своей обработки, чтобы использовать свои собственные потоки, а не потоки нити.

Чтобы проверить, запутан ли пул потоков, запустите фоновый поток, который периодически (несколько раз в секунду) проверяет ThreadPool.GetAvailableThreads и регистрирует сообщение, когда доступный является небольшим (даже если он никогда не равен нулю при проверке, если он иногда приближается к нулю, то, скорее всего, это проблема).

Размер бассейна можно изменить ThreadPool.SetMaxThreads, хотя это может быть и не самое лучшее решение. Если вы используете потоки threadpool для более длительных запущенных задач, остановите его. Для длительных задач используйте свои собственные потоки.

+0

Есть ли способ увеличить threadpool? – Nathan

+0

Это вопрос? Почему бы не задать вопрос в качестве вопроса вместо комментария :) – Timwi

+0

@ Натан, Тимви прав, если у вас есть другой вопрос, лучше всего исследовать его или задать отдельный вопрос. Легче получить правильный ответ, а другим - найти ответ, когда у него будет тот же вопрос. –

0

Возможные обходной путь:

DateTime mayContinue = DateTime.MinValue; 
bool blockingUi = false; 

private void Timer_Elapsed(object source, ElapsedEventArgs e) 
{ 
    if(blockingUi) 
    { 
     if(DateTime.Now < mayContinue) 
     { 
      // Notify time remaining 
      // Update the UI with a BeginInvoke 
     } 
     else 
     { 
      blockingUi = false; 
      // Notify ready 
      // Update the UI with a BeginInvoke     
     } 
    } 
} 

private void BlockUi() 
{ 
    mayContinue = DateTime.Now.AddSeconds(30); 
    blockingUi = true; 
} 
1

класс таймера вы используете очень важно

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

, но я не думаю, что проблема сама по таймеру, , например, попытаться сделать приложение, использующее тот же самый класс таймера

, который ТОЛЬКО записывает текущую дату Date в журнал регистрации ле

и оставить ее работать в течение очень длительного периода времени, вы увидите, что там нет такого 3/4 секунды задержать

обзор кода таймер и проверьте, что никаких общих ресурсов не осуществляется доступ на то же время, возможно, таймер в порядке, но есть узкое место в функции обработчика события или в «что-то», которое использует функция

Смежные вопросы