我知道如何对已经定义的文本框http://msdn.microsoft.com/en-us/library/ms171728.aspx进行线程安全更新....如何在程序中稍后生成的文本框上执行此操作?非常感谢你的建议。
答案 0 :(得分:3)
给定一些TextBox
对象,只需调用它:
TextBox foo = new TextBox(...);
// Code to add the new box to the form has been omitted; presumably
// you do this already.
Action update = delegate { foo.Text = "Changed!"; };
if (foo.InvokeRequired) {
foo.Invoke(update);
} else {
update();
}
如果你经常使用这种模式,这种扩展方法可能会有所帮助:
public static void AutoInvoke(
this System.ComponentModel.ISynchronizeInvoke self,
Action action)
{
if (self == null) throw new ArgumentNullException("self");
if (action == null) throw new ArgumentNullException("action");
if (self.InvokeRequired) {
self.Invoke(action);
} else {
action();
}
}
然后您可以将代码缩减为:
foo.AutoInvoke(() => foo.Text = "Changed!");
这将做正确的事情,在主GUI线程上执行委托,无论你当前是否在它上面执行。
答案 1 :(得分:0)
我们在这里肯定需要更多的信息,但是从我可以收集到的信息来看,你感到遗憾的是线程的主要功能没有任何参数。您可以创建周围类的文本框成员,并以这种方式访问它们。如果你走这条路线,一定要使用互斥锁或其他一些锁定设备来处理线程。