Общий таймер, который работает как в WinForms, так и в других приложениях. - PullRequest
1 голос
/ 04 марта 2011

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

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

Существует ли установленный шаблон для безопасного вызова события таймера без предварительного знания типа приложения (WinForms, WPF, Silverlight, ASP.NET и т. Д.), Который будет его использовать?

1 Ответ

2 голосов
/ 04 марта 2011

Существует ли установленный шаблон для безопасного вызова события таймера без предварительного знания типа приложения (WinForms, WPF, Silverlight, ASP.NET и т. Д.), Который будет его использовать?

Существуют таймеры, не зависящие от платформы в рамках: System.Threading.Timer и System.Timers.Timer .Тем не менее, они оба потребуют от вас обработки маршалинга обратно в контекст синхронизации, поскольку они генерируют свои события в потоке потоков.

Вы можете предоставить этот маршалинг в общем виде, то есть: сделать «таймер»класс, который оборачивает один из вышеперечисленных, принимая SynchronizationContext в качестве аргумента.Когда происходит событие Tick таймера, вы можете Опубликовать данные обратно в контекст.По сути, это то, что делает таймер Windows Forms.

Затем вы просто создадите его в потоке пользовательского интерфейса и передадите SynchronizationContext.Current в класс «новый таймер».Это будет работать для Windows Forms, WCF, WPF, Silverlight и т. Д., Поскольку все они устанавливают SynchronizationContext в своем «основном» потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...