在我的 GUI 代码中,我经常这样写:
private void SecondTimer_Elapsed(object sender, ElapsedEventArgs e)
{
if (progressBar1.InvokeRequired)
{
progressBar1.BeginInvoke(new ElapsedEventHandler(SecondTimer_Elapsed), new[] {sender, e});
return;
}
//Code goes here
}
当然,如果应用程序是多线程的,这是必需的,因为我们需要编码最初创建控件的线程。问题是,编写委托(delegate)并将参数放入数组可能很乏味,而且它会占用每个此类事件处理程序顶部的空间。 是否有一个属性或类似的东西可以为您替换此代码?基本上是一个标签,上面写着“如果您在错误的线程上,请在 GUI 线程上使用相同的参数再次调用我”
最佳答案
我不知道有什么类似的东西,但这对你来说可能是一个有用的扩展方法:
public static class Extensions
{
public static void Execute(this ISynchronizeInvoke invoker,
MethodInvoker action)
{
if (invoker.InvokeRequired)
{
invoker.BeginInvoke(action);
}
else
{
action();
}
}
}
现在这只适用于无参数委托(delegate),当然......但是对于 lambda 表达式来说这不是问题:
progressBar1.Execute(() => SecondTimer_Elapsed(sender, e));
这样做有以下优点:
- 写起来简单
- 签名不会出错(您不依赖后期绑定(bind))
MethodInvoker
的执行效率略高于其他委托(delegate),我相信- 如果要执行的代码不多,可以写在lambda表达式中内联
关于c# - Form.BeginInvoke 有缩写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489197/