Я работаю с фреймворком, который запускает собственный диспетчер событий в отдельном потоке. Структура может генерировать некоторые события.Обработка событий в C#
class SomeDataSource {
public event OnFrameworkEvent;
void FrameworkCallback() {
// This function runs on framework's thread.
if (OnFrameworkEvent != null)
OnFrameworkEvent(args);
}
}
Я хочу доставить эти события к объекту Winforms в потоке Winforms. Я, очевидно, проверяю InvokeRequired
и при необходимости отправлю его в Winforms.
class SomeForm : Form {
// ...
public void SomeAction(SomeArgs args) {
if (InvokeRequired) {
BeginInvoke(new Action(SomeAction), args);
return;
}
// ...
}
}
Теперь события могут быть доставлены, если форма находится в процессе закрытия, который вызывает все виды проблем, поэтому я разрегистрировать обработчик событий формы из источника событий фреймворки на Winforms нити, как это:
var form = new SomeForm();
var src = new SomeDataSource();
// ...
src.OnFrameworkEvent += form.SomeAction;
form.Closing += (sender, eargs) => src.OnFrameworkEvent -= form.SomeAction;
В настоящее время этот подход нить-сейф? Если форма находится в процессе закрытия, а внешний поток вызывает
BeginInvoke
, будет ли вызов выполняться в очереди, если форма закрыта? (что означает, что у меня все еще есть возможность столкнуться с одной и той же проблемой)Есть ли лучший подход или рекомендуемый образец для обработки событий с перекрестными потоками?
Мне нравится этот подход. Мне нравится использовать методы обратного вызова для сигнализации, когда поток выполняется. –