哪个C#程序集包含Invoke?

替代问题:为什么VS10如此热衷于抱怨Invoke?

在我不断追求让我的应用程序成为世界上最好的C#程序员的过程中,我认为线程是一件好事。

MSDN有一篇关于对控件进行线程安全调用的有用文章,但它(以及看似关于该主题的所有其他文章)倾斜地引用了一个名为Invoke的方法。 有时甚至是BeginInvoke, 我读过的也是首选 。

如果我能让visual studio识别Invoke,那么这一切都会很棒。 MSDN说它包含在System.Windows.Forms程序集中 ,但我已经’使用’了。 可以肯定的是,我也尝试过使用System.Threading,但无济于事。

我需要通过哪些环节才能调用工作?

Invoke在Control中。 即Control.Invoke();

由于System.Windows.Forms没有这样的方法,因此无法直接调用Invoke。 Invoke方法是一个控制成员。

这是我之前做的一个例子 :

 public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); public static void AddListViewItem(ListView control, ListViewItem item) { if (control.InvokeRequired) { AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); control.Invoke(d, new object[] { control, item }); } else { control.Items.Add(item); } } 

您需要在包含它的某个实例上调用Invoke – 如果您使用的是Windows窗体,那么它将是一个控件:

 control.Invoke(someDelegate); 

或者对于表单中的代码,您可以使用隐式this引用:

 Invoke(someDelegate); 

你不应该经历任何特殊的箍。 如果Visual Studio抱怨,请指定编译器错误及其抱怨的代码。 Invoke在这里没什么特别的。

winform InvokeControl的实例方法 – 您只需要一个控件实例(在很多情况下可以是this )。 例如:

 txtBox.Invoke(...); 

如果你想要抽象,它也可以通过接口或同步上下文访问 – 但最简单的方法是通过事件在UI处理它,在这种情况下,控件可以方便地使用。

如果你真的想成为世界上最好的c#程序员,你必须知道线程不是一件好事,除非正确使用。

跨线程更新UI通常表明您正在滥用线程。

无论如何, using System.Windows.Forms不够的,你必须将它添加到引用。 右键单击项目资源管理器中的引用 ,然后单击添加引用并选择System.Windows.Forms

Invoke是一个对象的方法,通常可以在Forms库的Controls和一些异步类中找到。 您当然需要特定的对象才能在控件/类上调用Invoke。

你可能试图从一个类中调用Invoke (即不是从FormControl Invoke )。 将您的代码移出类并进入表单或控件,您将看到Invoke编译并正常工作(严格来说,您的代码应该引用this.Invoke ,这使得方法的源清除,但Invoke将作为因为它假定了this )。