【发布时间】:2017-10-09 16:36:11
【问题描述】:
我试图从我的 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 可能不应该在主线程上运行。
【问题讨论】:
-
你能说明你的 DLL 中的函数是如何被调用的吗?您是从 .Net Windows 窗体应用程序中调用它吗?
-
在看到另一个问题的完全相反后,我不得不说:这表明您付出了巨大的努力。我的第一个想法是“单独的线程”,但后来我看到你已经尝试过了。我希望我能给你一个更好的答案。
-
我在问你是怎么称呼它的,因为我记得你前几天问的一个 COM 暴露的 C# dll,我想知道这是否是一个相关问题。您是否尝试通过 COM 调用调用此方法?
-
使用那个单独的线程,您是否尝试过显示表单 (
XForm.Show()),告诉表单到顶部(加载时执行类似this.BringToFront()的操作),并在其上设置计时器那会关闭它(如果它是您只想暂时显示的消息)? -
@pstrjds 它与我前几天询问的同一个项目有关,但这个函数不是直接通过 COM 调用的。我不确定这会如何影响我想要实现的目标?
标签: c# .net visual-studio dll