Re[3]: WinForms и многопоточные приложения
От: GlebZ Россия  
Дата: 22.10.10 13:53
Оценка: 1 (1)
Здравствуйте, Alex Dav, Вы писали:

GZ>>Сделать набор чего-то типа


GZ>>
GZ>>public static class MyControlInvoker
GZ>>{
GZ>>     public void Invoke(this Control ctrl, Action act)
GZ>>     {
GZ>>          if (ctrl.InvokeRequired)
GZ>>             ctrl.Invoke(act);
GZ>>          act();
GZ>>     }
GZ>>....
GZ>>}
GZ>>//using
GZ>>мyForm.Invoke(()=>MessageBox.Show(msg));
GZ>>


AD>А можно подробно рассказать что и для чего каждая строчка?

AD>Спасибо.
Ребят, вы что? Прочитать хоть одну книжку по родному языку в падлу?
Окей. Тут используется две технологии: Extentions и Lambda. Кратко на пальцах:
public static void Invoke(this Control ctrl, Action act)
слово this рассказывает нам что данный метод является extension методом, и будет показываться во всех классах Control как евойный собственный. Лишь бы был подключен namespace для этого класса. Такое вот волшебство.
В результате, будьто кнопка или форма, мы вполне можем прописать:
myButton.Invoke....
myForm.Invoke....

Данный метод будет как родной.
Насчет лямбды. Лямбда не является сама по себе делегатом. Для того чтобы лямбду можно было сохранить, нужно что-то типа:

var myDelegate=new MyDelegateType(()=>MessageBox.Show(msg));

Но нас спасает от такого кодовредительства две вещи:
1. С# позволяет не писать new MyDelegateType(...) а написать
var myDelegate = ()=>MessageBox.Show(msg);

такой вот синтаксический сахар.
2. Вместо того чтобы плодить делегаты и типы есть универсальные типы делегатов — Action и Func<Result>. Есть generic версии типа Action<T>, Action<T, T1>...Func<Result,T>, Func<Result,T,T1> но они нас не волнуют, так как задача не так сложна и у нас есть замыкание. Они отличаются лишь тем что делегат Func возвращает значение, а Action не возвращает. С помощью их можно описать любой метод.

Ну и ессно, об Invoke. Если взглянуть рефлектором, то Invoke задействует механизм оконных сообщений для того, чтобы синхронизировать выполнение данной процедуры с тредом в котором выполняется WinForms форма. Если мы уже находимся в данном потоке, о чем нам говорит возвращаемый результат InvokeRequired, то задействовать его и не нужно.

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