[英]Form.show() starting from event in another thread
我有一个在Form项目中触发事件的类。 触发事件的类中的方法在单独的线程中运行。 问题是如何从主线程(UI线程)加载表单?
namespace test
{
public partial class Form1 : Form
{
Class1 cl1 = new Class1();
static public Form2 f2 = new Form2();
public Form1()
{
InitializeComponent();
cl1.event1 += new Class1.del(CreateForm);
}
private void button1_Click(object sender, EventArgs e)
{
cl1.Almog();
}
static public void CreateForm()
{
//Form2 f2 = new Form2();
f2.Show();
}
}
}
namespace ClassLibrary1
{
public class Class1
{
public event del event1;
public delegate void del();
public void Almog ()
{
Thread t1 = new Thread(Print);
t1.Name="class1";
t1.Start();
}
public void Print ()
{
event1();
while(true)
{
Console.WriteLine("in the loop");
}
}
}
}
您需要使用MethodInvoker调用表单。 像这样...
static public void CreateForm()
{
Form2 f2 = new Form2();
f2.Invoke(new MethodInvoker(delegate()
{
f2.Show();
}));
}
您需要检查是否需要调用方法调用。
static public void CreateForm() {
Action action = () => { f2.Show(); };
if (f2.InvokeRequired) {
f2.Invoke(action);
} else {
action();
}
}
如果您从另一个表单调用另一个表单,则将获得异常跨线程操作无效 。 为此,您需要调用方法调用。
static public void CreateForm()
{
f2.Invoke(new MethodInvoker(delegate(){ f2.Show();}));
}
另外,请阅读以下内容以进一步澄清:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.