更新控件时非法交叉线程调用

时间:2015-11-15 08:02:46

标签: c# winforms

我在WinForms中搜索了许多用于异步更新UI控件的示例,并且大多数示例都有大量代码。有没有办法让这更容易?我觉得他们此时工作太多了。

我见过人们这样做:

await Task.Run(() =>
{
    doSomething();
});

但我听说这很糟糕并且无法正常工作,我不喜欢用多个await Task.Run(()=> {});实例来编写我的UI代码。我已经看到了大量关于背景工作者的例子。

有没有更好的方法可以做到这一点,不需要太多的样板代码?

1 个答案:

答案 0 :(得分:0)

我喜欢使用一种方法:

  1. 创建一个调用操作的控件扩展名:

    public static void Update(this Control ctrl, Action a)
    {
        if (ctrl.InvokeRequired) 
        { 
            ctrl.BeginInvoke(new MethodInvoker(a), null); 
        }
        else 
        { 
            a.Invoke(); 
        }
    }
    
  2. 然后将其称为:control.Update(()=> { /* code to update control */ });

  3. 例如:

    listView1.Update(() =>
    {
        ListViewItem lvi = new ListViewItem("something");
        lvi.SubItems.Add("something else");
        listView1.Items.Add(lvi);
    });