将UserControl从工作线程添加到Winform中的主UI线程时发生跨线程冲突

时间:2011-10-27 05:52:43

标签: winforms multithreading

我有一个基于标签页的应用程序。为了减少启动时间,我只创建向用户显示的标签页。

启动表单后,我使用BackgroundWorker创建其他标签页。标签页包含带数据绑定的用户控件。

工作正常。问题是:有一个标签页我遇到跨线程违规。该标签页也有数据绑定。

那么这种情况会出现什么问题?

谢谢你的到来。

1 个答案:

答案 0 :(得分:3)

WinForms控件具有线程关联性。应该在创建它们的同一个地方访问它们。这是因为WinForms实际上只是Win32功能的包装,而在Win32中管理Windows和子控件的代码不是线程安全的。因此,只能在创建它们的同一个线程上访问Form和子控件。

在你的情况下,你不应该使用BackgroundWorker线程创建TabPage实例,或者实际上除了主线程之外的任何其他线程,我认为你拥有包含你正在添加页面的TabControl的主Form。

开发人员通常很幸运,并设法在创建它们的不同线程中使用控件,并且不会崩溃。但这只是纯粹的运气,迟早会开始失败。