如何从另一个线程显示表单

时间:2011-07-01 15:27:39

标签: c# .net multithreading forms

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

DisplayDownload form2 = new DisplayDownload();

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

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

我尝试使用此帖子中接受的答案:Calling a windows form from another thread (.Net)但我收到此错误:

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

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

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


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

有人可以告诉我我做错了什么以及如何让它发挥作用?

3 个答案:

答案 0 :(得分:1)

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

MainForm.Invoke(new Action(delegate { ... }));

C#2及更高版本可以隐式地将方法组转换为委托,但仅限于特定的委托类型 Invoke方法采用基类Delegate类,因此没有特定的委托类型供编译器创建。
因此,您需要自己明确创建一个委托。

答案 1 :(得分:1)

添加new MethodInvoker(delegate(),所以:

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


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

答案 2 :(得分:0)

您想要为新表单处理事件的哪个线程?如果您希望主线程处理事件,请使用Control.Invoke作为现有示例建议。

如果您希望新线程管理自己的UI事件,则需要调用Application.Run。当你这样做时,表单将能够自己绘制并在屏幕上显示。