多UI线程——Winforms我想在我的应用程序中创建多UI线程。我模拟了如下场景。我在后台线程中单击一个按钮以创建一个新的窗口/表单命名空间WindowsFormsApplication1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){varthread=newThread(()=>{Formf=newForm();Application.Run(f);});//thread.IsBackground=true;--不需要。请参阅下面的解决方案thread.SetApartmentState(ApartmentState.STA);线程.Start();注意-我正在做IsBackground=true因为当用户关闭主窗体时,子窗体/窗口也应该关闭。有没有更清洁/优雅的方式来实现同样的目标?编辑-我想为每个窗口创建一个专用的UI线程。我将有10个这样的窗口并行显示实时数据。解决方案——这样好吗?(根据msdn和汉斯下面的评论)设置公寓状态(见上面的代码)protectedoverridevoidOnClosed(EventArgse){Application.Exit();与线程打交道迟早只会咬你一口。来自MSDN:Windows窗体中的控件绑定到特定线程并且不是线程安全的。所以如果你从另一个线程调用一个控件的方法,你必须使用该控件的调用方法之一来调用正确的线程调用你当然可以使用任意多的线程,但是不要试图创建一个变通方法来能够使用不同的线程来更新用户界面。请在您的工作线程/后台线程中调用/调用必需的。使用扩展方法使其更清晰:AutomatedInvokeRequiredcodepattern我认为你需要将线程的单元状态设置为单线程,就像这里的ApartmentStatefort.SetApartmentState(ApartmentState.STA),这里是Thread-safeForm.Show:t.SetApartmentState(ApartmentState.STAt.SetApartmentState(ApartmentState.STA)。我不知道这在后台线程上是否可行。我要你看的另一件事是MDI(多文档界面,例如这里)。做你真的需要将不同的窗体显示为它们自己的窗口,还是将它们放在通用窗体中?你当然可以有创建多个UI线程的原因。你可以处理MainForm.Closing事件并为每个子窗体调用subForm。关闭(编组到正确的线程。不过,我不确定你为什么在单独的线程上使用这些表单。你不能只在主线程上非模态地显示子表单吗?以上是C#学习教程:multipleUIthread–Winforms分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
