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

ここでは間違いなくより多くの情報が必要ですが、私が収集できることから、スレッドのメイン関数が引数をとらないという事実を嘆いています。テキストボックスを周囲のクラスのメンバーにして、その方法でアクセスすることができます。ただし、このルートを使用する場合は、スレッドにミューテックスまたはその他のロックデバイスを使用してください。

于 2012-10-08T22:00:51.423 に答える