消失的Windows窗体

时间:2009-09-16 17:40:15

标签: c# winforms

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

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

执行此操作将显示表单,但是,它不会重新绘制,因为它是在与while(true)相同的线程上启动的。

MaForm settingsForm = null;

void init(){
    While(true){
      if(settingsForm == null){
         settingsForm = new MaForm();
         settingsForm.show();
      }

    }
}

显示的版本,但随后消失。

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();
      }
}

我做错了什么?我有什么关于线程的东西吗? 你们觉得怎么样?

3 个答案:

答案 0 :(得分:1)

线程正在启​​动,显示您的表单,然后完成并关闭(关闭表单)。

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

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

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

答案 1 :(得分:0)

在C#中处理线程问题的一种好方法是在类和表单的顶部注释掉using System.Threading;。您可能有一些令人信服的理由显示带有Thread的表单,但可能没有,因为Form.Show()不是阻止通话。

如果您尝试使用Main()方法展示表单,请尝试使用ShowDialog()。此调用将阻止,直到表单关闭。

答案 2 :(得分:0)

您可以尝试这样做:创建表单,输入无限循环,调用DoEvents()以便表单可以处理Windows消息:

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


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

编辑:您可以通过检查true可见性来替换SettingsForm条件。当表格关闭时,保持无限循环是浪费。