7

さて、私は文字列、ラベル、リンクラベル、クラスなどに役立つ拡張機能/メソッドのファイルを書いています。

しかし、私には問題があります。showMessage()ラベルのテキストを変更するメソッドがありますが、正常に機能します。しかし、私はそれをスレッド実行で機能させることにし、それから私はこれを行います:

namespace LabelExtensions
{
    public static class LabelExtensionsClass
    {        
        private delegate void UpdateState();

        public static void ShowMessage(this Label label, string text)
        {
            if (label.InvokeRequired)
            {
                label.Invoke((UpdateState)delegate
                {
                    label.Text = text;
                });
            }
            else
            {
                  label.Text = text;
            }
        }
}
}

すみません、タイプミスでした。このコードをフォーラムに入力しました。エラーは続きます。

ドキュメントによると、Invokeメソッドを使用するには、以下をインポートする必要があります。

名前空間: System.Windows.Forms

アセンブリ: System.Windows.Forms(System.Windows.Forms.dll内)

それから私はしました:

using System.Windows.Forms;

しかし、これは同じエラーを返します:

The name 'Invoke' does not exist in the current context

どうすればこれを修正できますか?

前もって感謝します。

4

5 に答える 5

8

なぜこれをしないのですか?

label.BeginInvoke( (Action) (() => label.Text = text));

独自のデリゲートを作成する必要はありません。組み込みのアクションデリゲートを使用するだけです。おそらく、Labelクラスではなく、基本Controlクラスの拡張メソッドを作成する必要があります。より再利用可能になります。

于 2011-12-16T16:46:14.677 に答える
3

変化する

Invoke((UpdateState)delegate …

label.Invoke((UpdateState)delegate …
于 2011-12-16T16:42:42.400 に答える
1

コードでラベルを指定するのを忘れました(Invokeメソッドを呼び出すとき)。

public static void ShowMessage(this Label label, string text)
        {
            if (label.InvokeRequired)
            {
                lablel.Invoke((UpdateState)delegate
                {
                    label.Text = text;
                });
            }
            else
            {
                  label.Text = text;
            }
        }

また、代わりにBeginInvokeを使用して、呼び出し元のスレッドをブロックしないようにすることを検討してください(該当する場合)

于 2011-12-16T16:42:16.180 に答える
1

InvokeインスタンスメソッドですControl。あなたはあなたのようなそれを呼び出す
必要があります。Controllabel

于 2011-12-16T16:43:24.833 に答える
1

新しいデリゲートタイプを宣言したり、新しいラムダまたは匿名デリゲートを作成したりする必要はありません。あなたはすでにUIスレッドに作用するメソッドを持っています-あなたが書いているものです。このように、必要に応じてUIスレッドで自分自身を呼び出すようにします。

public static void ShowMessage(this Label label, string text) {

    if(label.InvokeRequired) {
        label.Invoke(new Action<Label, string>(ShowMessage), label, text);
        return;
    }

    label.Text = text;
}

このアプローチの利点は、リダイレクトコードブロックをこのメソッドから同じ方法で変更する他のメソッドにほぼコピーして貼り付けることができることです。

于 2011-12-16T16:58:28.310 に答える