2013-04-08 2 views
17

Я действительно борюсь с этим. Я создаю приложение winforms в визуальной студии и нуждаюсь в таймер фона, который тикает один раз каждые полчаса - цель этого - вытащить обновления с сервера.Создание таймера фона для асинхронного запуска

Я пробовал несколько разных подходов, но они потерпели неудачу, из-за плохого учебника/примеров или моих собственных недостатков в C#. Я думаю, что было бы пустой тратой времени, чтобы показать вам, что я пробовал, насколько мне кажется, что я пробовал, было довольно далеко.

Кто-нибудь знает, какой простой и простой способ реализовать асинхронный таймер фона, который легко понять новичку C#?

+2

Я предполагаю, что вы используете 'System.Timers.Timer'? –

+2

На мой взгляд, самый важный вопрос: сколько работы будет выполняться при запуске таймера? Каким будет эффект от обратной совместимости вашей программы. Обратите внимание, что все приложения WinForms запускаются в одном потоке пользовательского интерфейса, если этот поток становится занятым, вдруг вытаскивая некоторые данные с сервера, вашим пользователям может это не понравиться, поэтому вам нужно многопоточное решение или нет. – Siraf

+0

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

ответ

27
// Create a 30 min timer 
    timer = new System.Timers.Timer(1800000); 

    // Hook up the Elapsed event for the timer. 
    timer.Elapsed += OnTimedEvent; 

    timer.Enabled = true; 


... 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    // do stuff 
} 

с обычными предостережений: таймер не будет очень точным и, возможно, потребуется GC.KeepAlive(timer)

Смотрите также: Why does a System.Timers.Timer survive GC but not System.Threading.Timer?

+2

Это самый простой способ. +1 –

+0

Боже мой, это было так просто! Там должны быть лучшие примеры, подобные этому, которые можно найти более легко. Спасибо! –

+2

Вы можете упростить его далее: 'timer.Elapsed + = OnTimedEvent;' Вы можете потерять часть «новый ElapsedEventHandler». –

4

Я думаю, что вам нужно знать обо всех классов таймера. См. Ответ Джона ниже.

Какой таймер вы используете?

  1. System.Windows.Forms.Timer будет выполняться в потоке пользовательского интерфейса
  2. System.Timers.Timer выполняющей в поточно-пула потоков, если вы не указать SynchronizingObject
  3. System.Threading.Timer осуществляет свою обратный вызов в потоке пула потока

Во всех случаях сам таймер будет асинхронным - он не будет «поднимать» поток до тех пор, пока он не загорится.

Источник: Do .NET Timers Run Asynchronously?

+2

-1: ответ - это дословная перепечатка ответа Джона. Таким образом, это было бы более уместно в качестве комментария. –

+0

Обычно это правда, но это Джон Скит, о котором мы говорим. +1. –

10

Declare переменной-члена в вашей форме:

System.Timers.Timer theTimer; 

В виде нагрузки (или любой другой раз, когда вам нужно, чтобы начать обновление опроса), выполните:

theTimer = new System.Timers.Timer(1800000); 
theTimer.Elapsed += PollUpdates; 
theTimer.Start(); 

Объявите свою функцию участника PollUpdates следующим образом:

private void PollUpdates(object sender, EventArgs e) 
{ 
} 
+0

извините за возможный дубликат ответа от Mitch Wheat, я отправил его в одно и то же время :) –

+0

Да, но спасибо в любом случае! К сожалению, я могу только отметить один ответ, как принято, и с тех пор, как сначала ответил митч, справедливо отметить его. Но я добавил +1 к вам - спасибо :) –