1

我知道如何对已经定义的文本框进行线程安全更新http://msdn.microsoft.com/en-us/library/ms171728.aspx .... 我如何在文本框上执行此操作稍后在程序中生成?非常感谢您的建议。

4

2 回答 2

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 线程上执行委托,无论您当前是否正在其上执行。

于 2012-10-08T21:38:59.053 回答
0

我们在这里肯定需要更多信息,但据我所知,您在感叹线程的 main 函数不接受任何参数这一事实。您可以使文本框成为周围类的成员,并以这种方式访问​​它们。如果你走这条路,一定要为线程使用互斥锁或其他一些锁定设备。

于 2012-10-08T22:00:51.423 回答