我知道这个问题曾经被问过,但是我正在寻找一种方法:
这是到目前为止的内容,但是我想删除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,但保持相同的功能?
您还可以使用扩展方法和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上使用,并且能够访问实现类的属性和字段。
InvokeEx
this.InvokeEx(f => f.listView1.Items.Clear());