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

时间:2018-06-29 08:21:56

标签: c# windows

我已经看到了几个调用Application.Run()的控制台应用程序的示例,它们在没有表单的情况下在当前线程上启动了消息循环。

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

但是,如文档所述:

  

在基于Win32或Windows Forms的应用程序中,消息循环为   处理用户事件(例如鼠标单击和   键盘笔触。

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

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

1 个答案:

答案 0 :(得分:6)

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

棘手的问题,但这是软件工程中非常普遍且具有通用解决方案的问题,必须解决producer-consumer problem。它需要由操作系统提供的线程安全队列。一个循环清空该队列并调度通知,这就是Application.Run()所做的。

这也是使代码在特定线程上运行的唯一实用方法。看起来应该很容易做,但事实并非如此。线程总是忙于执行代码,您不能随便中断它并强迫它做其他事情,这会造成可怕的重新输入问题。调度程序循环是一个安全的位置,线程在该位置发出信号表明它处于空闲状态并准备执行其他操作。可能是您为什么看到它在控制台模式应用程序中使用的原因。尤其是当您在该代码中看到异步/等待时,就会死定了。