2010-08-24 43 views

回答

2

你需要使用一个委托,并调用......

private delegate void SetLabelSub(string NewText); 
private void SetLabel(string NewText) 
{ 
if (this.InvokeRequired()) { 
    SetLabelSub Del = new SetLabelSub(SetLabel); 
    this.Invoke(Del, new object[] { NewText }); 
} else { 
    SomeLabel.Text = NewText; 
} 
} 

然后,你可以调用SetLabel("New Text Here")从任何线程

+2

如何回旋。只需编写'Invoke(new Action(()=> SomeLabel.Text = NewText));'。在不是绝对必要时执行调用的性能影响可以忽略不计,在99%的情况下,程序员已经知道它始终会从另一个线程调用。 – Timwi 2010-08-24 02:18:50

+0

一个非常有效的点 - 但我要明确:) – Basic 2010-08-24 02:22:38

0

如果你正在处理线程,你需要使用form.Invoke ()方法,假设你将表单实例传递给另一个表单。 大致 窗体form1 =新窗体() Form2 = new Form(); form2.CallingForm = form1; <使这个属性或什么都

内窗口2添加像

form1.Invoke(someDelagate,value)的一些代码;

我不会做winforms,但如果你经常使用google form.voke,你会得到一些关于如何做跨线程操作的很好的例子。

+0

那么亚去,下一篇文章告诉你如何编写invoke方法。 – cdmdotnet 2010-08-24 02:15:55

4

你可以写,你可以从任何线程调用一个方法:

private void SetLabel(string newText) 
{ 
    Invoke(new Action(() => SomeLabel.Text = NewText)); 
} 

然后,你可以调用SetLabel("Update the label, please")从任何线程。

然而,你的问题标题状态“从另一个”,而不是“从另一个线程”,所以目前还不清楚是什么你实际上意味着。如果您只想拥有多个表单,则不需要多线程。您应该只将线程用于任务,例如下载文件,复制文件,计算值等,但不适用于表单。

1

如何写一个更通用的方法来改变任何控制Text属性在您的形式,如:

private void SetText(Control control, string text) 
{ 
    if (control.InvokeRequired) 
     this.Invoke(new Action<Control>((c) => c.Text = text),control); 
    else 
     control.Text = newText; 
} 

这将为标签,按钮等工作,无论从UI线程或任何其他线程。

相关问题