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

Какой самый эффективный способ вызова метода каждые 20 секунд

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

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

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

Благодарим вас за помощь.

4b9b3361

Ответ 1

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

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

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

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

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

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

И не забывайте System.Timers.Timer:

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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


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
}