c# - Windows 窗体在构造函数完成后立即终止

标签 c# winforms

我目前正在编写一个 IRC 机器人/客户端,并且偶然发现了一个小问题。每个 channel 都将显示在具有自己的一组控件的单独窗口中。我创建了一个适当的窗口类 ChanWindow:

public partial class ChanWindow : Form
{
    string Chan;
    string Username;

    IRCBot Caller;

    public ChanWindow(string channame, string uname, IRCBot caller)
    {
        Caller = caller;
        Caller.Join(channame);
        InitializeComponent();
        Chan = channame;
        Name = Chan;
        Username = uname;
    }

    //various functionalities required for window use
}

我将窗口对象存储在 ConcurrentDictionary<string, ChanWindow> 中,因为(应该是)有一个单独的线程向窗口发送经过适当编辑的消息。它们都是在循环中初始化的:

 foreach (string chan in Chanlist)
 {
     Chans[chan] = new ChanWindow(chan, Name, this);
     Chans[chan].Show();
 }

哪里ChanlistList<string>加入的 channel 。 目睹了 Windows 在程序启动后不久就死掉了,我在 Username = uname; 行中放置了一个断点。 ChanWindow 构造函数并注意到它在窗口死亡之前立即被触发。

我的主要问题是:原因是什么以及如何避免?使用字典是个好主意吗?我应该构建某种包装器/容器类来处理窗口的功能吗?

最佳答案

我怀疑你没有

Application.Run(new ChanWindow());

在您的主入口点(默认情况下为Program.Main())。

如果您不让主 GUI 线程显示表单,并等待它关闭,则没有什么可以阻止线程完成和您的应用程序关闭。


如果你想独立启动消息循环,你仍然需要调用 Application.Run()所以主线程将开始处理事件。如果您在不带参数的情况下调用它,消息循环将不会自动停止,因此当您希望消息循环停止时,您必须显式调用 Application.Exit() 。然后主线程就会继续执行到程序结束并结束。

您可以对您的代码执行此操作,

 foreach (string chan in Chanlist)
 {
     Chans[chan] = new ChanWindow(chan, Name, this);
     Chans[chan].Show();
 }

 Application.Run();

但是,如果您想自动退出应用程序,您可以继承自己的 ApplicationContext,如 already linked MSDN documentation 中所述。 ,并将其传递给 Application.Run(),这就是它的用途。

关于c# - Windows 窗体在构造函数完成后立即终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16239009/

相关文章:

c#通过内存地址调用方法

c# - WebBrowser 控件中的 InvokeMember ("click")

c# - RadGridView 子行内的 UserControl - Telerik Winforms

c# - 监视文件夹并查找文件是否在 Windows 应用程序中打开

c# - WinForms设计器错误(无法加载资源)

c# - 正则表达式匹配变量多行?

c# - 向刚体添加力不起作用。错误: UnityEngine.组件不包含AddForce的定义并且没有AddForce的扩展方法

c# - Web.config 运行时/legacyCorruptedStateExceptionsPolicy 设置不起作用

c# - 如果项目是由 SharpDevelop 生成的,则 OpenFileDialog 会被 Norton Antivirus 阻止

c# - 运行基本的 orleans 应用程序时出现异常