Windows窗体在构造函数完成后立即死亡

本文关键字:窗体 构造函数 Windows | 更新日期: 2023-09-27 18:10:58

我目前正在编写一个IRC聊天机器人/客户端,我偶然发现了一个小问题。每个通道都将显示在一个单独的窗口中,并带有自己的一组控件。我已经创建了一个合适的窗口类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();
 }

其中Chanlist为待连接通道的List<string>。目睹了窗口在程序启动后不久死亡,我在ChanWindow构造函数的Username = uname;行中设置了一个断点,并注意到它在窗口死亡之前立即被触发。

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

Windows窗体在构造函数完成后立即死亡

我怀疑你没有

Application.Run(new ChanWindow());

在主入口点(默认为Program.Main())。

如果你不让主GUI线程Show的形式,并等待它关闭,没有什么会阻止线程完成和你的应用程序关闭。


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

你可以对你的代码这样做,

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

但是,如果您想自动退出应用程序,您可以继承自己的ApplicationContext,正如已经链接的MSDN文档中概述的那样,并将其传递给Application.Run(),这就是它的作用。