Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在扩展名/方法文件中使用Invoke方法?_C#_.net_Multithreading_Invoke_Invokerequired - Fatal编程技术网

C# 如何在扩展名/方法文件中使用Invoke方法?

C# 如何在扩展名/方法文件中使用Invoke方法?,c#,.net,multithreading,invoke,invokerequired,C#,.net,Multithreading,Invoke,Invokerequired,我正在写一个扩展名/方法文件,对字符串、标签、链接标签、类等都很有用 但是,我有个问题。我有一个showMessage()方法可以更改标签的文本,效果很好。但我决定通过线程执行来实现这一点,然后我会这样做: namespace LabelExtensions { public static class LabelExtensionsClass { private delegate void UpdateState(); publi

我正在写一个扩展名/方法文件,对字符串、标签、链接标签、类等都很有用

但是,我有个问题。我有一个
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
我怎么解决这个问题


提前感谢。

您忘记在代码中指定标签(当您调用Invoke方法时):

也可以考虑使用,这样就不会阻塞调用线程(如果适用)

更改

Invoke((UpdateState)delegate …

Invoke
控件的一个实例方法
你需要一个
控件来调用它,比如你的
标签

为什么不这样做呢:

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

无需创建自己的委托。只需使用内置的委托即可。您可能应该为基类而不是Label类创建扩展方法。它将更加可重用。

您不需要声明新的委托类型,也不需要构造新的lambda或匿名委托。您已经有了一个作用于您正在编写的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;
}
publicstaticvoidshowmessage(此标签,字符串文本){
if(label.invokererequired){
label.Invoke(新操作(ShowMessage)、标签、文本);
返回;
}
label.Text=文本;
}

这种方法的优点是,您几乎可以将重定向代码块从该方法复制并粘贴到您希望以相同方式修改的任何其他方法。

您可以使用现有的
操作
委托;您不需要创建自己的。也许,
(label.TopLevelControl作为表单)。准确地调用
。您需要的“Invoke”方法是System.Windows.Forms.Control类的成员,标签是从该类派生的。静态LabelExtensions类没有“Invoke”方法。
label.BeginInvoke( (Action) (() => label.Text = text));
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;
}