Я использую потоки для запуска длинных операций в пользовательском интерфейсе моей программы, чтобы он не блокировался. Однако в этих задачах мне нужно обновить элементы управления, что невозможно не из потока, на котором они были созданы. Рекомендуется использовать control.BeginInvoke (Delegate) для выполнения метода, который вы хотите.C# Control.Invoke группа методов
Однако для этого вам необходимо объявить тип делегата, и только тогда вы можете их вызвать.
Таким образом, это выглядит следующим образом: если я хочу, чтобы выполнить методу пустот Update(), я должен идти:
delegate void CallbackVoid();
void Update() {...}
...(in task code)...
this.BeginInvoke(new CallbackVoid(Update));
Это довольно утомительно делать для каждого метода там. Не могу я просто как-то сделать это, естественно, как:
void Update() {...}
this.BeginInvoke(Update);
Как это отличается от control.Invoke (новый EventHandler (делегат {/ * update control here * /})); ? Что лучше? – Arie
@Arie Оба правильные, но не другие. MSDN говорит: «Делегат может быть экземпляром EventHandler, и в этом случае параметр отправителя будет содержать этот элемент управления, а параметр события будет содержать EventArgs.Empty. Делегат может также быть экземпляром MethodInvoker или любым другим делегатом, который принимает список параметров void. Вызов делегата EventHandler или MethodInvoker будет быстрее, чем вызов другого типа делегата « – Alex
@voo: На самом деле это * неверно для Windows Forms, и это вопрос, о котором идет речь ... –