繁体   English   中英

C#,Windows窗体和Application.Run()

[英]C#, Windows Forms, and Application.Run()

当我在窗体上调用Application.Run()时,此命令似乎会暂停程序,直到窗体关闭为止。 是否可以在不停止程序的情况下使用其他命令来创建表单? 谢谢

当您调用Run ,它不会暂停程序。 它将控制权转移到Windows Forms主消息循环。 您要执行的任何其他代码都应在单独的线程中或在事件处理程序(例如Form_Load)中运行。

myForm F = new myForm();
F.Show();

阅读完您的帖子和评论后,您说您想制作一个IRC应用程序。 我敢肯定有很多方法可以做到这一点,但是我认为这是我会做到的。

我将创建一个在其自己的线程中执行所有IRC内容的库项目。 收到消息后,让它触发一个事件。 然后提供发送消息的方法。

然后,创建引用IRC库的WinForm项目。 让表单引用您所创建的类的实例,并注册所有事件。 然后,只要表单需要发送消息,它就只调用SendMessage方法。 每当触发事件时,IRC表单都会获取该事件并正确显示信息(例如在正确的聊天室选项卡或服务器日志中放置正确的消息)。

通过这种方式,您可以创建一种非常容易地连接到多个服务器的方式,因为这使得IRC可以非常重用。 而且,您还可以按预期的方式运行WinForm,而不必进行破解。

当然,您可以-只需创建一个新线程并在该线程上旋转表单即可-但是当您开始对UI元素进行多线程处理时,您将面临很多潜在的麻烦。

您能解释为什么要继续处理吗? 可能最好是松开一个工作线程来执行后台任务,而不要使用主线程。

编辑:根据您的阐述,我认为您可能是从错误的方向进行的。

从Windows的角度来看,你的主要形式基本上你的应用程序。 Application.Run调用正在启动Windows 消息循环 ,该消息循环处理应用程序和操作系统之间的通信处理和调度。 这是程序的“核心循环”,是完成所有UI处理的地方。

通常,除非您有需要不断执行的任务,否则您不希望弄乱消息循环,如果可能的话,您希望它们占用100%的CPU。 (一个很好的例子是计算机游戏中的模拟和渲染循环;通常,您希望它使用计算机的全部资源来尽可能快地渲染更新。)

在您的情况下,您感兴趣的是后台通信处理,它是独立于UI且需要在应用程序运行期间一直运行的过程。 这是应用程序在其初始化过程中产生的工作线程的最佳选择。 尽管“纯粹的”分离模型可能会建议将此旋转启动放入应用程序main()函数中,但我建议您出于所有意图和目的将主Form_Load事件视为“ main”事件。 您可以创建一个通讯管理器类,并在Load事件期间在后台线程上对其进行初始化,以允许其在后台处理数据并发出事件以使UI响应。

这将显示表格而不会暂停程序

new Form().Show()

代码在这里会有所帮助。 通常,当您在program.cs文件中启动Windows.forms项目时,Visual Studio会生成Application.Run()调用。 您无需在任何地方自己称呼它。

如果这不是您的问题,则您的表单中可能存在带有严重循环错误的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM