我最近创建了这两个(不相关的)方法来替换我的 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);
}
}
编辑:参见相关问题here https://stackoverflow.com/questions/258409/how-to-get-information-about-an-exception-raised-by-the-target-of-controlinvoke
UPDATE
继死锁问题之后(相关于这个问题 https://stackoverflow.com/questions/2055960/control-invoke-getting-stuck-in-hidden-showdialog),我已经从Invoke切换到BeginInvoke(参见解释here https://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke/229558#229558).
另一个更新
关于第二个片段,我越来越倾向于使用“空委托”模式,它通过直接使用空处理程序声明事件来“从源头”解决此问题,如下所示:
event EventHandler MyEventRaised = delegate {};
这是好东西。让它们成为扩展方法,以进一步清理代码。例如:
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void Raise(this EventHandler eventToRaise, object sender)
{
EventHandler eventHandler = eventToRaise;
if (eventHandler != null)
eventHandler(sender, EventArgs.Empty);
}
现在,您可以在您的事件上调用: myEvent.Raise(this);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)