这是在c#中完成的windows应用程序中的交叉线程操作,我该如何更改?
答案 0 :(得分:4)
您可以编写一个可以从任何线程调用的方法:
private void SetLabel(string newText)
{
Invoke(new Action(() => SomeLabel.Text = NewText));
}
然后你可以从任何线程中调用SetLabel("Update the label, please")
。
但是,您的问题标题是“从另一个表单”而不是“来自另一个主题”,因此不清楚您的实际含义。如果您只想拥有多个表单,则不需要多线程。您应该仅将线程用于任务,例如下载文件,复制文件,计算值等,但不适用于表单。
答案 1 :(得分: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 :(得分: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线程或任何其他线程的标签,按钮等。
答案 3 :(得分:0)
如果您正在处理线程,则需要使用表单。Invoke()
方法,假设您将表单实例传递给另一个表单。来自
Form form1 = new Form()
Form form2 = new Form();
form2.CallingForm = form1; // make this property or what ever
在form2中添加一些代码,如
form1.Invoke(someDelagate, value);
我不经常使用winforms,但如果你是google form.Invoke你会得到一些关于如何进行跨线程操作的好例子。