У меня есть графический интерфейс, подписанный на событие в сторонней библиотеке, которое сообщает графическому интерфейсу, что ему необходимо обновиться. Сторонняя библиотека запускает событие в потоке, который она запустила, поэтому мне нужно вернуться в поток графического интерфейса, чтобы что-то сделать. Я реализовал такой код
Код: Выделить всё
//in onload
lib.JobDoneEvent += HandleJobDoneCompleteEvent;
private void HandleJobDoneCompleteEvent(object sender, JobArgs args){
this.Invoke( (MethodInvoker) delegate{
UpdateWithData(sender, args);
});
}
Коллега сказал мне, что лучше было бы сделать что-то подобное
Код: Выделить всё
private EventHandler CompletionHandler;
//In onload
CompletionHandler = UpdateWithData;
lib.JobDoneEvent += HandleJobDoneCompleteEvent;
private void HandleJobDoneCompleteEvent(object sender, JobArgs args){
CompletionHandler?.Invoke(this, args);
}
Мне кажется, что последний будет иметь больше накладных расходов из-за необходимости выполнять нулевую проверку каждый раз, когда событие срабатывает во время выполнения, тогда как первый просто скомпилировал бы делегат во время выполнения. Мне также кажется странным создавать обработчик событий для создания события из события, которое будет использоваться только с одним методом.
Какая практика лучше/стандартнее для перемещения данных из одного потока в поток графического интерфейса и почему? Существует ли более стандартная/лучшая практика, отличающаяся от любого из этих подходов?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... to-gui-thr