Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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_Multithreading_Forms - Fatal编程技术网

C# 如何显示来自另一个线程的表单

C# 如何显示来自另一个线程的表单,c#,.net,multithreading,forms,C#,.net,Multithreading,Forms,我在我的C#Winforms应用程序(我的表单名为MainForm)上的单独线程中运行此代码: 但是当线程启动时,表单永远不会打开。如果我将代码移动到我的应用程序的主线程上,它会很好地打开,但如果我将其作为自己的线程启动,则表单永远不会打开 我尝试使用此帖子中的公认答案:但我得到了以下错误: 无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型 以下是我尝试使用的代码: MainForm.Invoke(delegate { DisplayDownloa

我在我的C#Winforms应用程序(我的表单名为MainForm)上的单独线程中运行此代码:

但是当线程启动时,表单永远不会打开。如果我将代码移动到我的应用程序的主线程上,它会很好地打开,但如果我将其作为自己的线程启动,则表单永远不会打开

我尝试使用此帖子中的公认答案:但我得到了以下错误:

无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型

以下是我尝试使用的代码:

MainForm.Invoke(delegate {
         DisplayDownload form2 = new DisplayDownload();


         form2.TopMost = true; 
         form2.Show();
});

有人能告诉我我做错了什么以及如何让它工作吗?

您需要显式地实例化一个委托类型:

MainForm.Invoke(new Action(delegate { ... }));
C#2及更高版本可以隐式地将方法组转换为委托,但只能转换为特定的委托类型。
Invoke
方法采用基本的
Delegate
类,因此编译器没有要创建的特定委托类型。

因此,您需要自己显式创建一个委托。

添加
新的MethodInvoker(delegate()
,因此:

MainForm.Invoke(new MethodInvoker(delegate() 
{
             DisplayDownload form2 = new DisplayDownload();


             form2.TopMost = true; 
             form2.Show();
}));

您希望哪个线程处理新窗体的事件?如果您希望主线程处理事件,请按照现有示例所示使用
Control.Invoke


如果您想让新线程管理自己的UI事件,那么您需要调用
应用程序。运行
。当您这样做时,表单将能够自己绘制并在屏幕上可见。

您可能应该调用
BeginInvoke()
,它不会等待方法完成运行。当我粘贴到代码中时,会出现相同的错误:“无法将匿名方法转换为类型‘System.Delegate’,因为它不是委托类型”这次我忘记添加新的MethodInvoker:)我在尝试使用新更新/修订的代码时遇到此错误:非静态字段、方法或属性“System.Windows.Forms.Control.Invoke(System.Delegate)”需要对象引用。我自己尝试了代码,创建
Form1
Form2
,并在
Form1
中添加按钮1,当按钮1单击时,我使用此代码运行
Form2
,一切正常。但是什么是
MainForm
?我假设您引用的是当前表单“因此在这种情况下,它将被
this
关键字”替换,对吗?我在将其添加到我的代码中时遇到此错误:非静态字段、方法或属性“System.Windows.Forms.Control.Invoke(System.Delegate)”需要对象引用。我添加了那行代码,并将我的代码替换为“…”。是这样吗?@fra:您需要获取
MainForm
类的现有实例。@SLaks:有些情况下它们是合适的,我们还没有得到足够的信息来确定这是否是其中之一,所以我提供了两个选项。
MainForm.Invoke(new MethodInvoker(delegate() 
{
             DisplayDownload form2 = new DisplayDownload();


             form2.TopMost = true; 
             form2.Show();
}));