我试图在我的DLL函数中显示一个简单的表单(只显示一个标签)。但是,我需要在不阻止执行此功能的情况下显示此表单(例如,显示表单并继续执行功能。)
我尝试过使用:
form.ShowDialog();
然而,这显然是一个模态对话框,因此阻止执行直到用户与之交互。我也尝试过使用:
form.Show();
但是这会导致表单加载到所有其他窗口后面,并且控件无法正确加载(只显示空白框应该在哪里。)
为了尝试解决这些问题,我尝试在新线程上创建和显示表单,如下所示:
Thread thread = new Thread(ShowXForm);
thread.Start();
并且像这样:
new Thread(delegate ()
{
ShowXForm();
}).Start();
其中:
private void ShowXForm()
{
frmX XForm = new frmX();
XForm.ShowDialog();
}
同样,这些导致几乎与使用Show而不创建新线程的行为相同。
在不同的线程上运行的另一个困难是我仍然需要能够从主线程更新表单上的标签(可以使用委托来实现吗?)
我知道将主线程作为UI线程是一个好习惯,但是这是一个DLL而不是Windows表单应用程序,感觉UI可能不应该在主线程上运行。< / p>
答案 0 :(得分:1)
对Application.Run()的调用需要 INSIDE 一个新线程。
像...一样的东西。
private void ShowXForm()
{
new Thread(delegate ()
{
frmX XForm = new frmX();
Application.Run(XForm);
}).Start();
}
如果你想让它更新,你必须在类级别保留该表单引用,并为其提供一种机制来传递更新,并使该表单正确编组,使用委托/调用自身调用()。