为什么 C# 控制台应用程序可以调用"Application.Run()"?



我看过几个控制台应用程序调用Application.Run()的例子,它在当前线程上启动一个没有表单的消息循环。

https://msdn.microsoft.com/en-us/library/ms157900(v=vs.110(.aspx

但是,正如文档所述:

在基于 Win32 或 Windows 窗体的应用程序中,消息循环是一个 处理用户事件(如鼠标单击和 键盘敲击。

因此,似乎Application.Run()仅适用于 GUI 应用程序。

那么从控制台应用程序调用Application.Run()的目的是什么,是否有更智能的方法在控制台应用程序中实现相同的功能?

你必须看到更大的图景,不是 Application.Run(( 创建 GUI 应用程序。 它正在创建一个这样做的窗口。 支持窗口的类库以及与之交互的许多系统和第三方组件从来都不是线程安全的。 但是 GUI 必须始终处理从不同线程生成的通知,这些线程通常位于不同的进程或操作系统中。

棘手的问题,但它在软件工程中很常见并且有一个通用的解决方案,你必须解决生产者 - 消费者问题。 这需要一个线程安全队列,它由操作系统提供。 还有一个清空队列并调度通知的循环,这就是 Application.Run(( 所做的。

也是让代码在特定线程上运行的唯一实用方法。这似乎是应该很容易做到的事情,但事实并非如此。 线程总是忙于执行代码,你不能随意中断它并强制它做其他事情,这会产生可怕的重入问题。 调度程序循环是线程发出空闲并准备执行其他操作的信号的安全点。 可能是为什么您看到它在控制台模式应用程序中使用的原因。 尤其是当您在该代码中看到 async/await 时,会发出死铃声。

最新更新