Подтвердить что ты не робот

Создание фонового таймера для асинхронного запуска

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

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

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

4b9b3361

Ответ 1

    // 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)

См. также: Почему System.Timers.Timer выживает GC, но не System.Threading.Timer?

Ответ 2

Объявите переменную-член в вашей форме:

System.Timers.Timer theTimer;

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

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

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

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

Ответ 3

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

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

  • System.Windows.Forms.Timer будет выполняться в потоке пользовательского интерфейса
  • System.Timers.Timer выполняется в потоке пула потоков, если только вы       укажите объект SynchronizingObject
  • System.Threading.Timer выполняет обратный вызов в потоке пула потоков.

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

Источник: Выполняют ли асинхронно таймеры .NET?