我如何继续这个无形式应用程序,C#

问题描述 投票:0回答:1
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run();
    
var sim = new SimMain();

SimInterpreter interpreter;
interpreter.interpreterMain(sim);

Application.Exit();

我正在尝试制作一个以控制台为中心的应用程序,可以选择在输入特定命令时弹出表单。但我无法找到一种方法来通过 Run() 语句,因为应用程序此时冻结了。我需要帮助!

我尝试使用 Run(new SimMain()),但最终它更加强调表单而不是控制台,而且我找不到隐藏它的方法。在 Run() 之前运行控制台移交代码可以让控制台控制应用程序进程,但输入弹出窗口的命令时不会显示表单中的组件。

我用谷歌搜索了多个关键词,但与无形应用相关的文章比沙漠中的水还稀缺。

c# winforms console
1个回答
0
投票

您需要了解控制台与 UI 程序的工作原理。

在控制台程序中,您有一个用于运行事物的“主”线程。您始终可以控制该线程。当该线程退出主方法时,您的控制台程序将终止。

在 UI 程序中,有一个“UI 线程”。您无法像控制台程序那样直接控制该线程。相反,它将运行一个“消息泵/循环”来处理来自操作系统的事件。这本质上是一个处理来自队列的消息的无限循环。因此,如果您单击按钮,操作系统将会发送一条“鼠标按下”消息。 UI 代码将找出您单击的按钮,并引发相应的按钮事件处理程序。从那里您可以做任何您需要做的事情。但您需要将控制权返回给消息泵。否则将显示“应用程序已挂起”消息。

调用

Application.Run()
将启动这样的消息泵,但实际上不显示任何形式。因此“冻结应用程序”是预期的行为。

如果您需要控制台部分与 UI 部分同时工作,我将创建一个新线程,并使用

ShowDialog()
在该线程上显示您的表单。这也将启动消息泵,并使这个新线程成为“UI 线程”。但你需要非常小心才能使其正常工作。

  1. 您只能从 UI 线程更新 UI,因此任何更新都需要通过发送消息来完成,(请参阅Control.BeginInvoke)。
  2. 任何共享数据都需要通过锁或其他同步来保护,以防止多线程危险。
  3. 其他问题我还没想过。

仅当您确实熟悉多线程和线程安全时,我才会推荐此方法。否则,我建议要么制作一个 UI 要么 一个控制台应用程序,或者在启动时决定它会是什么。根据您的具体用例的详细信息,可能还有其他解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.