我目前正在编写一个 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();
}
哪里Chanlist
是 List<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/