【发布时间】:2011-11-30 18:41:44
【问题描述】:
我正在修改现有的 WinForms 项目。该项目具有用户控件。 此 UserControl 具有 DataSet 变量,该变量是从程序的另一部分在不同线程中设置的。
我想要做的是根据DataSet动态添加另一个控件到这个控件。
因此,在加载 DataSet 后,我正在调用 RefreshChildControl 函数并尝试将我的新 ChildUserControls 添加到 flowLayoutPanel。这就是问题开始的地方:)。我得到“跨线程操作无效:控件'ChildUserControl'从创建它的线程以外的线程访问”异常。我尝试使用 if(this.InvokeRequired) 并调用此方法,但没有帮助。 MyUserControl 上的 InvokeRequired 为 false。
那么,有没有什么好的方法来完成这样的任务呢?还是我错过了什么重要的东西?
编辑:
我试图跳过 InvokeRequired 测试并在此方法上调用 this.FindForm().Invoke。我有“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”例外。而且,顺便说一句,当我用这个控件打开另一个表单时,一切正常。
【问题讨论】:
-
请注意 InvokeRequired 有问题:ikriv.com/en/prog/info/dotnet/MysteriousHang.html
-
不要使用 UserControl 来执行这个测试,它正忙于创建。而是使用您要将其添加到的表单。或者完全跳过测试,你知道这段代码在错误的线程上运行。使用 BackgroundWorker 来帮助您做到这一点。
-
我试图跳过 InvokeRequired 测试并在此方法上调用 this.FindForm().Invoke。我有“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”例外。而且,顺便说一句,当我用这个控件打开另一个表单时,一切正常。因此,看起来表单句柄在调用时并未创建。但不幸的是,我不知道该怎么办。在这种情况下如何使用 BackgroundWorker?
标签: c# .net winforms multithreading