gpt4 book ai didi

c# - 我必须调用 Application.ExitThread() 吗?

转载 作者:行者123 更新时间:2023-11-30 13:12:50 31 4
gpt4 key购买 nike

using System.Windows.Forms;

public class App
{
[STAThread]
public static void Main()
{
string fname;
using (var d = new OpenFileDialog())
{
if (d.ShowDialog() != DialogResult.OK)
{
return;
}
fname = d.FileName;
}
//Application.ExitThread();
for (; ;)
;
}
}

上面的代码显示了一个文件对话框。选择文件并按下 open 后,for 循环就会执行,但(卡住的)对话框仍然存在。

一旦我取消注释 Application.ExitThread(),对话框就会按预期消失。

这是否按预期工作?为什么 using 不会使窗口消失?我在哪里可以找到有关此的更多信息?

最佳答案

您已经发现了单线程应用程序的主要问题……长时间运行的操作卡住了用户界面。

您的 DoEvents() 调用本质上是“暂停”您的代码,并为其他操作(如 UI)提供运行的机会,然后恢复。问题是您的 UI 现在再次卡住,直到您再次调用 DoEvents()。实际上,DoEvents() 是一个 very problematic approach (some call it evil)。你真的不应该使用它。

您有更好的选择。

将长时间运行的操作放在另一个线程中有助于确保 UI 保持响应并尽可能高效地完成工作。处理器能够在两个线程之间来回切换,以提供同时执行的错觉,而没有成熟的多进程的困难。

完成此操作的一种更简单的方法是使用 BackgroundWorker ,尽管它们通常已经失宠(原因我不打算在这篇文章中讨论:further reading)。然而,它们仍然是 .NET 的一部分,并且学习曲线比其他方法低,因此我仍然建议新开发人员在业余项目中使用它们。

目前最好的方法是 .NET 的 Tasks图书馆。如果您的长时间运行的操作已经在一个线程中(例如,它是一个数据库查询,您只是在等待它完成),并且如果库支持它,那么您可以使用 async 来利用任务。关键字,而不必三思而后行。即使它不在线程或受支持的库中,您仍然可以启动一个新任务并通过 Task.Run() 在单独的线程中执行它。 . .NET 任务具有内置语言支持等优势,例如协调多个任务和将任务链接在一起。

关于c# - 我必须调用 Application.ExitThread() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37655586/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com