我有一个在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");
}
}
}
}
答案 0 :(得分:0)
您需要使用MethodInvoker调用表单。像这样...
static public void CreateForm()
{
Form2 f2 = new Form2();
f2.Invoke(new MethodInvoker(delegate()
{
f2.Show();
}));
}
答案 1 :(得分:0)
您需要检查是否需要调用方法调用。
static public void CreateForm() {
Action action = () => { f2.Show(); };
if (f2.InvokeRequired) {
f2.Invoke(action);
} else {
action();
}
}
答案 2 :(得分:0)
如果您从另一个表单调用一个表单,您将收到异常跨线程操作无效。为此,您需要调用方法调用。
static public void CreateForm()
{
f2.Invoke(new MethodInvoker(delegate(){ f2.Show();}));
}
另外,请阅读此内容以获得进一步说明: