我正在为应用程序开发一个插件,该应用程序“使用”我的代码(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();
}
}
我做错了什么?我有什么关于线程的东西吗? 你们觉得怎么样?
答案 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
条件。当表格关闭时,保持无限循环是浪费。