为什么我的线程在显示Windows窗体后立即终止?

men*_*hem 5 c# multithreading winforms

我有一个Windows窗体应用程序(Form1),允许用户打开另一个窗体(FormGraph).为了打开FormGraph应用程序,我使用一个打开它的线程.
这是线程正在运行的代码:

private void ThreadCreateCurvedGraph()
{
    FormGraph myGraph = new FormGraph();
    myGraph.CreateCurvedGraph(...);
    myGraph.Show();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是myGraph它在打开后立即关闭.
1)有谁知道为什么会这样,以及如何myGraph保持开放?
2)用户关闭后myGraph,如何终止线程?
非常感谢!

Han*_*ant 5

问题不在发布的代码段中.您需要使用Application.Run()或Form.ShowDialog()启动新的消息循环.您还需要处理线程属性,因此适合充当UI线程.例如:

  Thread t = new Thread(() => {
    Application.Run(new Form2());
    // OR:
    //new Form2().ShowDialog();
  });
  t.SetApartmentState(ApartmentState.STA);
  t.IsBackground = true;
  t.Start();
Run Code Online (Sandbox Code Playgroud)

这里有一些尴尬的选择.表单不能由主线程上的任何表单拥有,这通常会导致Z顺序问题.当UI线程的主窗体关闭时,您还需要做一些有意义的事情.通过使用IsBackground在这里解决了问题.

Windows旨在支持在一个线程上运行的多个窗口.如果你真的需要,只使用这样的代码.你永远不应该......


And*_*rey 0

不要在非主线程中创建和显示表单。在主窗体线程中执行此操作。

或者这样做:

private void ThreadCreateCurvedGraph()
{
    FormGraph myGraph = new FormGraph();
    myGraph.CreateCurvedGraph(...);
    Application.Run(myGraph);
}
Run Code Online (Sandbox Code Playgroud)

但第一个版本更好