Form1中代码如下:(添加一个Button控件和一个label控件)
delegate void UpdateUIDelegate(string text, Color color,Form1 form);
public void UpdateUI(string text, Color color,Form1 form)
{
if (this.label1.InvokeRequired)
{
UpdateUIDelegate UIUpdater = new UpdateUIDelegate(UpdateUI);//实例化代理
this.Invoke(UIUpdater, new object[] { "newText", Color.Green,form }); //同步调用代理,参数与代理方法中形参对应
}
else
{
label1.Text = text;
label1.ForeColor = color;
}
}
private void button1_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.startThread();
}
Class1类如下:
class Class1
{
Form1 form = new Form1();
Thread myWorkerThread;
public void startThread()
{
myWorkerThread = new Thread(new ThreadStart(ExecuteProcessing));
myWorkerThread.Start();
}
public void ExecuteProcessing()
{ form.UpdateUI("newText", Color.Green, form);
}
}
程序功能很简单,仅为了测试,Form1中调用class1的方法StartThread,在这个方法中开启一个线程,在次线程中完成在主窗体中显示一个绿色的newText。
问题:程序执行到了相关代码,但主窗体中没有相关显示。
delegate void UpdateUIDelegate(string text, Color color,Form1 form);
public void UpdateUI(string text, Color color,Form1 form)
{
if (this.label1.InvokeRequired)
{
UpdateUIDelegate UIUpdater = new UpdateUIDelegate(UpdateUI);//实例化代理
this.Invoke(UIUpdater, new object[] { "newText", Color.Green,form }); //同步调用代理,参数与代理方法中形参对应
}
else
{
label1.Text = text;
label1.ForeColor = color;
}
}
private void button1_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.startThread();
}
Class1类如下:
class Class1
{
Form1 form = new Form1();
Thread myWorkerThread;
public void startThread()
{
myWorkerThread = new Thread(new ThreadStart(ExecuteProcessing));
myWorkerThread.Start();
}
public void ExecuteProcessing()
{ form.UpdateUI("newText", Color.Green, form);
}
}
程序功能很简单,仅为了测试,Form1中调用class1的方法StartThread,在这个方法中开启一个线程,在次线程中完成在主窗体中显示一个绿色的newText。
问题:程序执行到了相关代码,但主窗体中没有相关显示。
你这个form应该在Class1的构造函数中赋值,例如
class Class1
{
public Class1(Form host)
{
form = host;
}
}
{
if (this.label1.InvokeRequired)
{
this.Invoke((EventHandler)delegate{UpdateUI(text,color);});
return;//避免继续执行
}
label1.Text = text;
label1.ForeColor = color;
}private void button1_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
c.startThread();
}class Class1
{
public void startThread(Form1 host)
{
new Thread((ThreadStart)delegate
{
form.UpdateUI("newText", Color.Green, form);
}).Start();
}
}