C# 消失窗体

C# 消失窗体,c#,winforms,C#,Winforms,我正在为一个应用程序开发一个插件,该应用程序“使用”我的代码(类库),并在自己的线程中执行Init()方法。 在Init()中,我有一个while(true)语句,这样我的插件就可以连续运行 昨天,我开始制作一个windowsForm来配置我的插件(使用XML),现在我想展示它,但它一直在消失。我的代码如下: 这样做将显示表单,但它不会重新绘制,因为它与while(true)在同一线程上启动 显示但随后消失的版本 MaForm settingsForm = null; Thread worker

我正在为一个应用程序开发一个插件,该应用程序“使用”我的代码(类库),并在自己的
线程中执行
Init()
方法。 在Init()中,我有一个
while(true)
语句,这样我的插件就可以连续运行

昨天,我开始制作一个windowsForm来配置我的插件(使用XML),现在我想展示它,但它一直在消失。我的代码如下:

这样做将显示表单,但它不会重新绘制,因为它与while(true)在同一线程上启动

显示但随后消失的版本

MaForm settingsForm = null;
Thread worker = null;
void init(){
    While(true){
      if(worker == null){         
         worker = new Thread(new ThreadStart(formStuff));
         worker.Start();
      }    
    }
}
void formStuff()
{
     if(settingsForm == null){
         settingsForm = new MaForm();
         settingsForm.show();
      }
}
我做错了什么?我有没有遗漏一些关于线程的东西?
你们怎么看?

线程开始,显示表单,然后完成并关闭(关闭表单)

在单独的线程上显示表单几乎总是有问题的。表单需要一个消息泵才能运行——因此它们通常只有在GUI线程上启动并运行时才能正常工作

一个选项是调用函数将表单显示到主线程上。这将使窗体在主线程上加载(并运行)


或者,您可以在表单的线程上启动整个消息泵,并将线程设置为STA(这很重要)。但是,我建议尽可能避免这种方法。

在C#中处理线程问题的一个好方法是使用System.threading注释掉
位于类和窗体的顶部。使用
线程显示表单可能有一些令人信服的理由,但可能没有,因为
Form.Show()
不是阻塞调用


如果您试图从
Main()
方法显示表单,请尝试改用
ShowDialog()
。此调用将一直阻止,直到窗体关闭。

您可以尝试以下操作:创建窗体,进入无限循环,调用以便窗体可以处理windows消息:

if(settingsForm == null){
   settingsForm = new MaForm();
   settingsForm.show();
}


while (settingsForm != null && settingsForm.Visible)
{
    System.Windows.Forms.Application.DoEvents();
}

编辑:您可以通过检查
设置窗体
可见性来替换
true
条件。当表单关闭时,停留在无限循环中是一种浪费。

这是一个插件,我的主要方法是init()(只有一个我可以直接访问),在那里运行我的代码,显示表单,但它里面什么都没有(你知道,当你在按钮内创建while(true)函数时,单击call而不使用线程).它是否是插件并不重要。我写的一切都是真实的。拥有“while(true)”通常是一件要避免的好事情——特别是如果你没有在那里做任何事情的话。您应该提供插件~something~它可以用来处理UI线程,如果您的插件将处理用户界面-如果没有其他功能,请向init传递ISynchronizeInvoke参数(您的主窗体),以便它可以同步回UI线程。看:你能告诉我为什么投否决票,我也是来这里学习的。如果DoEvents看起来很邪恶,那么在WinForms应用程序中,我们调用application.Run()也是一样的;我投了反对票,因为在正常情况下你不应该使用DoEvents。在WiFrm应用程序中创建表单并显示它是最终的“正常情况”,并且根本不需要线程,并且绝对不需要在中间使用DoEvices调用的无限循环。此外,我不确定你的代码是否能解决他的问题(我还没有尝试过),但即使它解决了问题,也不建议使用它。不过,这不是针对个人的,你的帆船头像让我有点高兴。:)
if(settingsForm == null){
   settingsForm = new MaForm();
   settingsForm.show();
}


while (settingsForm != null && settingsForm.Visible)
{
    System.Windows.Forms.Application.DoEvents();
}