Какой самый эффективный способ вызывать метод каждые 20 секунд? - PullRequest
17 голосов
/ 24 мая 2010

Я хотел бы вызвать метод, передающий параметр каждые 20 секунд, например, public void ProcessPerson (IPerson)

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

Кроме того, есть ли способ сохранить строго типизированный параметр вместо использования объекта, а затем преобразовать его в IPerson?

Спасибо за помощь.

Ответы [ 3 ]

23 голосов
/ 24 мая 2010

A System.Threading.Timer - это то, что вам нужно:

Предоставляет механизм для выполнения метода с заданными интервалами.

Используйте делегат TimerCallback, чтобы указать метод, который вы хотите, чтобы Таймер выполнял. Делегат таймера указывается при его создании и не может быть изменен. Метод не выполняется в потоке, который создал таймер; он выполняется в потоке ThreadPool, предоставленном системой.

Также есть System.Windows.Forms.Timer:

Реализует таймер, который вызывает событие через определенные пользователем интервалы. Этот таймер оптимизирован для использования в приложениях Windows Forms и должен использоваться в окне.

Этот таймер Windows предназначен для однопоточной среды, в которой потоки пользовательского интерфейса используются для выполнения обработки.

И не забудьте System.Timers.Timer:

Компонент Timer - это серверный таймер, который позволяет вам указать повторяющийся интервал, с которым в приложении возникает событие Elapsed.

Серверный таймер предназначен для использования с рабочими потоками в многопоточной среде. Таймеры сервера могут перемещаться между потоками, чтобы обрабатывать возникшее событие Elapsed, что приводит к большей точности, чем таймеры Windows, для своевременного вызова события.

Так что исследуйте каждый и решите, какой из них лучше всего работает в вашем случае.

4 голосов
/ 24 мая 2010

Я бы пошел на System.Threading.Timer .Имейте в виду, что Windows не является системой ОС реального времени, поэтому время будет зависеть от того, какой механизм вы выберете.

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

Чтобы перенаправить запрос обратно в поток пользовательского интерфейса, вы можете сделать следующее

Для WinForms вы можете использовать Control.Invoke

Для WPF вы можете использовать Dispatcher.Invoke

Или вариант Async BeginInvoke

0 голосов
/ 24 мая 2010

Вы можете использовать это, просто убедитесь, что все, что вы делаете, потокобезопасно.


using System.Threading;

public void DoStuff(IPerson person)
{
    new Timer(ProcessPerson, person, 0, 20000);
}

public void ProcessPerson(object threadState)
{
   IPerson person = threadState as IPerson;
   // do your stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...