为什么我的线程在显示Windows窗体后立即终止?我有一个Windows窗体应用程序(Form1),允许用户打开另一个窗体(FormGraph)。为了打开FormGraph应用程序,我使用了一个线程来打开它。这是线程运行的代码:privatevoidThreadCreateCurvedGraph(){FormGraphmyGraph=newFormGraph();myGraph.CreateCurvedGraph(...);我的图表显示();我的问题是myGraph打开后myGraph关闭。1)有谁知道为什么会这样,以及如何让myGraph保持打开状态?2)用户关闭myGraph,如何终止线程?太感谢了!问题不在发布的代码片段中。您需要使用Application.Run()或Form.ShowDialog()启动新的消息循环。您还需要处理线程属性,因此适合充当UI线程。例如:Threadt=newThread(()=>{Application.Run(newForm2());//OR://newForm2().ShowDialog();});t.SetApartmentState(ApartmentState.STA);t.IsBackground=true;t.开始();这里有一些尴尬的选择。窗体不能由主线程上的任何窗体拥有,这通常会导致Z顺序问题。当主窗体在UI线程上关闭时,您还需要做一些有意义的事情。使用IsBackground解决了这里的问题。Windows旨在支持在单个线程上运行多个窗口。只有在确实需要时才使用这样的代码。你永远不应该......你的主要问题是你没有在新线程中构建消息泵。查看运行多个UI线程以获得有关如何使用多个线程(每个表单/表单组一个)运行高性能UI的详细概述。您基本上缺少的是调用Application.Run以在单独的UI线程上设置消息泵。我认为一旦消息泵的最后一种形式关闭-它会自行处理并结束。请注意,所有这些都假定您希望在单独的UI线程中打开窗口……否则您需要回调主UI线程以执行创建窗口的所有操作,因此它附加到现有的消息泵。两者都有很好的案例-一个保持简单,另一个允许更高的性能,因为每个窗口都有一个单独的消息泵,因此可以单独操作-例如,这在交易应用程序中使用很多,可能需要更新图表有很多屏幕和如果在UI中运行单线程,则会出现瓶颈。根据经验,您应该避免从线程中操作UI(创建表单是对UI的操作)。您应该始终从主线程操作UI。表单正在关闭,因为线程已完成并因此与其资源(表单)一起被释放。为了保持线程运行,您需要一个循环,例如privatevoidThreadCreateCurvedGraph(){FormGraphmyGraph=newFormGraph();myGraph.CreateCurvedGraph(...);我的图表显示();while(myGraph.IsOpen){//processincomingmessages你需要一种方法来设置IsOpen(如超时或按钮),显然你需要实际创建IsOpen作为表单的属性,并在表单打开时将其设置为true创建。我会像其他用户一样在这里添加......你应该有充分的理由不使用主线程。如果为表单准备数据需要一段时间,您可以在单独的线程中执行此操作以保持应用程序响应。一旦数据准备好,就可以将对象返回给主线程,让它显示出来。您应该在表单中为对象声明一个变量,而不是在方法中声明一个局部变量,这样它在线程退出时仍然存在。当您准备好显示表单时,您可以使用Invoke方法进行将在主线程中执行的方法调用。不要在非主线程上创建和显示表单。在主窗体线程中执行。或者这样做:privatevoidThreadCreateCurvedGraph(){FormGraphmyGraph=newFormGraph();myGraph.CreateCurvedGraph(...);应用程序运行(myGraph);但第一个版本更好为什么要在新线程上创建表单?有时您需要使用新线程,但有时您可以在主线程上使用form.ShowDialog()。如果将表单显示为对话框会怎样?您可以使用privatevoidThreadCreateCurvedGraph(){FormGraphmyGraph=newFormGraph();myGraph.CreateCurvedGraph(...);myGraph.ShowDialog();这样调用将阻塞,直到myGraph窗体关闭。当您在单独的线程上创建myGraph时,调用阻塞的ShowDialog应该只阻塞该线程。可能是垃圾回收:在ThreadCreateCurvedGraph()退出后,myGraph超出范围并关闭。您需要一种方法来组织您的线程以保持实例并等待(使用阻塞等待)它关闭。编辑:例如,将Application.Run(myGraph)添加到方法的末尾。(见TomTom的评论)以上是C#学习教程:为什么我的线程在显示WindowsForm后立即终止?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
