c# - Form.BeginInvoke 有缩写吗?

标签 c# .net winforms attributes syntactic-sugar

在我的 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/

相关文章:

.net - WCF错误: The caller was not authenticated by the service

c# - 对 ASP.NET 自定义验证器进行排序以及验证器的 Text 和 ErrorMessage 属性之间的差异

.net - WinForms 中的水印文本框

vb.net - 从后面的代码中使 VB.net winform 按钮看起来被按下

VB.NET 绝对奇怪的表单加载行为

javascript - Jquery 处理提交按钮的单击事件而不中断表单发布

c# - 从文件中提取特定的图标层,然后将其保存为具有透明度的 .ico 文件

c# - 在 C# 中覆盖 Object.Equals() 实例方法;现在代码分析/FxCop 警告 CA2218 : "should also redefine GetHashCode". 我应该抑制这个吗?

c# - .NET CultureInfo ru 和 ru-RU 之间的区别

c# - filesystemwatcher 多个文件