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

时间:2010-04-01 18:30:56

标签: c# winforms

当我在表单上调用Application.Run()时,此命令会暂停程序,直到表单关闭为止。是否有另一个命令我可以用来创建表单而不停止程序?感谢

6 个答案:

答案 0 :(得分:9)

当您致电Run时,它不会停止该程序。它将控制转移到Windows窗体主消息循环。您要执行的任何其他代码应该在单独的线程或事件处理程序中运行,例如在Form_Load中。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

阅读完您的帖子和评论后,您说您想要制作IRC申请。我确信有很多方法可以做到这一点,但这就是我认为我会这样做的方式。

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

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

这样做可以让您创建一种非常容易连接到多个服务器的方法,因为它使IRC内容非常可重用。而且你也有WinForm以它应该的方式运行,你不必破解它。

答案 3 :(得分:1)

当然,您可以 - 只需创建一个新线程并在该线程上旋转表单 - 但是当您启动多线程UI元素时,您将面临很多潜在的悲痛。

你能解释一下你为什么要继续加工吗?可能你最好不要使用工作线程来执行后台任务而不是使用主线程。

编辑:根据您的详细说明,我认为您可能会从错误的方向接近这一点。

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

作为一般规则,您不希望弄乱消息循环,除非您有不断的任务 - 您希望它们占用100%的CPU(如果可能) 。 (一个很好的例子是计算机游戏中的模拟和渲染循环;通常,您希望它使用计算机的完整资源尽可能快地渲染更新。)

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

答案 4 :(得分:0)

这将显示表格而不停止程序

new Form().Show()

答案 5 :(得分:0)

请在此处使用代码。通常,当您在program.cs文件中启动windows.forms项目时,Visual Studio会生成Application.Run()调用。你不应该在任何地方自己打电话。

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