Недавно я создал эти два (несвязанных) метода для замены большого количества кода котельной в моем приложении winforms. Насколько я могу судить, они работают нормально, но мне нужно какое-то подтверждение/совет о том, есть ли какие-то проблемы, которые я могу потерять.
(из памяти)
static class SafeInvoker
{
//Utility to avoid boiler-plate InvokeRequired code
//Usage: SafeInvoker.Invoke(myCtrl, () => myCtrl.Enabled = false);
public static void Invoke(Control ctrl, Action cmd)
{
if (ctrl.InvokeRequired)
ctrl.BeginInvoke(new MethodInvoker(cmd));
else
cmd();
}
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void RaiseEvent(object sender, EventHandler evnt)
{
var handler = evnt;
if (handler != null)
handler(sender, EventArgs.Empty);
}
}
ИЗМЕНИТЬ: см. соответствующий вопрос здесь
UPDATE
Следуя из проблем с тупиками (связанных с этим вопросом), я переключился с Invoke на BeginInvoke (см. объяснение здесь).
Другое обновление
Что касается второго фрагмента, я все чаще склоняюсь к использованию шаблона "пустой делегат", который исправляет эту проблему "в источнике", объявляя событие непосредственно с пустым обработчиком, например:
event EventHandler MyEventRaised = delegate {};