我在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();
});
有人可以告诉我我做错了什么以及如何让它发挥作用?
答案 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
。当你这样做时,表单将能够自己绘制并在屏幕上显示。