【发布时间】:2011-01-05 14:18:15
【问题描述】:
更新:只是总结一下我的问题归结为:
我希望构建 .NET 表单和控件不会创建任何窗口句柄 - 希望该过程延迟到 Form.Show/Form.ShowDialog
任何人都可以确认或否认这是真的吗?
我有一个带有选项卡控件的大型 WinForms 表单,表单上有许多控件,加载时会暂停几秒钟。我已将其范围缩小到设计器在 InitializeComponent 中生成的代码,而不是我在构造函数或 OnLoad 中的任何逻辑。
我很清楚,除了主 UI 线程之外,我无法尝试在任何线程上与 UI 交互,但我想做的是让应用程序预加载此表单(运行构造函数)在后台,因此一旦用户想要打开它,它就可以立即显示在 UI 线程上。但是,在后台线程中构建时,在设计器中的这一行:
this.cmbComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
我收到了错误
当前线程必须设置为单线程 OLE 之前的线程单元 (STA) 模式 可以拨打电话。确保您的 主函数具有 STAThreadAttribute 标记在上面。
现在这是设计器文件的一半,这让我希望总的来说这个策略会奏效。但这条特殊的线路似乎试图立即启动某种 OLE 调用。
有什么想法吗?
编辑:
我想我在这里没有说清楚。延迟似乎发生在设计器生成代码期间构建大量控件的过程中。
我希望所有这些初始化代码都发生在没有实际尝试触摸任何真正的 Win32 窗口对象的情况下,因为窗体实际上还没有显示出来。
我可以从这个后台线程设置(例如)标签文本和位置的事实让我希望这是真的。但是,它可能不适用于所有属性。
【问题讨论】:
-
是仅为 cmbox 或所有控件引发的异常。因为如果是这样,您可以将属性设置为最后一件事
-
仅用于在组合框上设置 AutoCompleteMode。在设计器的上面是大量的代码设置文本/名称/位置/大小/等。控件的属性。
-
在“预加载”表单时,您的应用程序会做什么?可能显示“请稍候”消息?
-
他们在预加载时为所欲为——这就是将其置于后台线程中的全部意义所在。
-
@Clyde:如果您只想显示可以处理用户输入的“请稍候”消息,您可以使用另一个线程来显示,然后让主线程启动带有许多控件的表单。
标签: c# winforms multithreading