gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:58:17 31 4
gpt4 key购买 nike

我目前正在编写一个 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 。看到程序启动后不久窗口就死了,我在行中放置了一个断点 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com