小编典典

调用任何跨线程代码的最佳方法?

c#

我知道这个问题曾经被问过,但是我正在寻找一种方法:

  1. 简化安全的跨线程代码的创建。
  2. 在任何情况下(无Windows窗体引用)都可以重用此代码。

这是到目前为止的内容,但是我想删除Windows Forms引用。有任何想法吗?

public delegate void SafeInvokeDelegate(System.Action action);
public class SafeInvoke
{
    private readonly System.Windows.Forms.Control _threadControl;

    public SafeInvoke()
    {
        _threadControl = new System.Windows.Forms.Control();
    }

    public void Invoke(System.Action action)
    {
        if (_threadControl.InvokeRequired)
            _threadControl.Invoke(new SafeInvokeDelegate(Invoke), new object[] {action});
        else if (action != null) action();
    }
}

上面的类可以这样使用:

SafeInvoke _safeInvoker = new SafeInvoke();
void SafeClearItems()
{
    _safeInvoker.Invoke(delegate
        {
            listView1.Items.Clear();
        });
}

如何删除SafeInvoke类中的System.Windows.Forms.Control,但保持相同的功能?


阅读 246

收藏
2020-05-19

共1个答案

小编典典

您还可以使用扩展方法和lambda来使代码更简洁。

using System.ComponentModel;
public static class ISynchronizeInvokeExtensions
{
  public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke
  {
    if (@this.InvokeRequired)
    {
      @this.Invoke(action, new object[] { @this });
    }
    else
    {
      action(@this);
    }
  }
}

因此,现在您可以InvokeEx在任何ISynchronizeInvoke上使用,并且能够访问实现类的属性和字段。

this.InvokeEx(f => f.listView1.Items.Clear());
2020-05-19