Здравствуйте, 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, то задействовать его и не нужно.
Вот на пальцах и все. Прошу не сравнивать с стандартами, ибо там точнее но зато не на пальцах. За подробностями в стандарты и другую научно-популярную литературу.