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,如何终止线程?
非常感谢!
问题不在发布的代码段中.您需要使用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旨在支持在一个线程上运行的多个窗口.如果你真的需要,只使用这样的代码.你永远不应该......
不要在非主线程中创建和显示表单。在主窗体线程中执行此操作。
或者这样做:
private void ThreadCreateCurvedGraph()
{
FormGraph myGraph = new FormGraph();
myGraph.CreateCurvedGraph(...);
Application.Run(myGraph);
}
Run Code Online (Sandbox Code Playgroud)
但第一个版本更好
| 归档时间: |
|
| 查看次数: |
2403 次 |
| 最近记录: |