Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不阻止程序执行的情况下显示窗体_C#_.net_Visual Studio_Dll - Fatal编程技术网

C# 在不阻止程序执行的情况下显示窗体

C# 在不阻止程序执行的情况下显示窗体,c#,.net,visual-studio,dll,C#,.net,Visual Studio,Dll,我试图从DLL的函数中显示一个简单的表单(只显示一个标签)。但是,我需要在不阻止此函数执行的情况下显示此表单(例如,显示表单和继续执行函数) 我试过使用以下方法: form.ShowDialog(); 但是,这显然是一个模式对话框,因此会阻止执行,直到用户与其交互。我还尝试使用: form.Show(); 但这会导致窗体加载到所有其他窗口之后,并且控件无法正确加载(只显示空白框) 为了解决这些问题,我尝试在新线程上创建并显示表单,如下所示: Thread thread = new Threa

我试图从DLL的函数中显示一个简单的表单(只显示一个标签)。但是,我需要在不阻止此函数执行的情况下显示此表单(例如,显示表单和继续执行函数)

我试过使用以下方法:

form.ShowDialog();
但是,这显然是一个模式对话框,因此会阻止执行,直到用户与其交互。我还尝试使用:

form.Show();
但这会导致窗体加载到所有其他窗口之后,并且控件无法正确加载(只显示空白框)

为了解决这些问题,我尝试在新线程上创建并显示表单,如下所示:

Thread thread = new Thread(ShowXForm);
thread.Start();
new Thread(delegate ()
{
    ShowXForm();
}).Start();
就像这样:

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可能不应该在主线程上运行。

对Application.Run()的调用需要在新线程内

类似于

private void ShowXForm()
{    
    new Thread(delegate ()
    {
        frmX XForm = new frmX();
        Application.Run(XForm);
    }).Start();
}

但是,如果您想让它更新,您必须将该表单引用保留在类级别,并为其提供一种传递更新的机制,并让该表单使用委托/调用()正确封送对自身的调用。

对Application.Run()的调用需要在新线程内部

类似于

private void ShowXForm()
{    
    new Thread(delegate ()
    {
        frmX XForm = new frmX();
        Application.Run(XForm);
    }).Start();
}


但是,如果您想让它更新,您必须将该表单引用保留在类级别,并为其提供一种传递更新的机制,并让该表单使用委托/调用()正确封送对自身的调用。

能否显示DLL中的函数是如何被调用的?你是从.Net windows窗体应用程序中调用它的吗?在看到另一个问题的完全相反的情况后,我不得不说:这表明你做出了卓越的努力。我的第一个想法是“独立线程”,但后来我看到你已经尝试过了。我希望我能给你一个更好的答案。我问你怎么称呼它,因为我记得你前几天问的一个COM公开的C#dll,我想知道这是否是一个相关的问题。您是否尝试通过COM调用调用此方法?使用该单独的线程,您是否尝试显示表单(
XForm.Show()
),告诉表单转到顶部(加载时执行类似于
this.BringToFront()
)的操作,并在其上设置一个计时器以关闭它(如果它是您只想临时显示的消息)?@pstrjds它与我前几天询问的同一个项目有关,但此函数不是通过COM直接调用的。我不确定这会如何影响我试图实现的目标?你能展示一下DLL中的函数是如何被调用的吗?你是从.Net windows窗体应用程序中调用它的吗?在看到另一个问题的完全相反的情况后,我不得不说:这表明你做出了卓越的努力。我的第一个想法是“独立线程”,但后来我看到你已经尝试过了。我希望我能给你一个更好的答案。我问你怎么称呼它,因为我记得你前几天问的一个COM公开的C#dll,我想知道这是否是一个相关的问题。您是否尝试通过COM调用调用此方法?使用该单独的线程,您是否尝试显示表单(
XForm.Show()
),告诉表单转到顶部(加载时执行类似于
this.BringToFront()
)的操作,并在其上设置一个计时器以关闭它(如果它是您只想临时显示的消息)?@pstrjds它与我前几天询问的同一个项目有关,但此函数不是通过COM直接调用的。我不确定这将如何影响我试图实现的目标?我开始添加这种性质的建议答案,但我认为您需要做的一件事是将该线程上的
ApartmentState
设置为STA。因此,您需要将创建与开始调用分开,以便将其设置为STA。我刚刚用ApartmentState集尝试了这段代码(正如@pstrjds所建议的)<代码>私有void ShowNotificationsForm(){Thread Thread=new Thread(委托(){frmNotifications notificationsForm=new frmNotifications();Application.Run(notificationsForm);});Thread.SetApartmentState(ApartmentState.STA);Thread.Start()然而,这仍然没有任何不同。也许我在这里遗漏了什么?一个有趣的观察结果是,在线程出现之前,表单似乎还没有创建。在代码的后面,睡眠被命中?@tj_-ush-我觉得那时还有很多其他事情在进行,这可能对我们来说很困难o诊断/建议,但不要看到更多您正在做的事情。例如,您正在谈论的
线程。Sleep
在哪里?您的代码是如何连接到主代码的?您是否只是实现了一个接口,并且在运行时注入了dll?@pst抱歉,我只发布了我认为与问题相关的代码。好的,以便快速概述代码。正如您所说,这只是一个接口,DLL在运行时被注入。有一个通过COM调用的函数(函数a)-它执行几个步骤,包括调用函数(X)问题所指的。函数X发出许多HTTP请求,这些请求的结果应该显示在表单中。我开始添加这种性质的建议答案,但我认为您需要做的一件事是将该线程上的
ApartmentState
设置为STA。因此,您需要将创建与开始通话,这样你就可以将其设置为STA。我有j