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

本文关键字:方法 Invoke 文件 扩展名 | 更新日期: 2023-09-27 18:18:00

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

但是,我有一个问题。我有一个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

Assembly: System.Windows.Forms(在System.Windows.Forms.dll中)

then I did:

using System.Windows.Forms;

但是返回相同的错误:

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

我如何解决这个问题?

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

为什么不这样做呢:

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

不需要创建自己的委托。只需使用内置的Action委托。您可能应该为Control基类而不是Label类创建扩展方法。

变化

Invoke((UpdateState)delegate …

label.Invoke((UpdateState)delegate …

您忘记在代码中指定标签(当您调用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来代替,这样就不会阻塞调用线程(如果适用)

InvokeControl实例方法
您需要一个Control来调用它,例如您的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;
}
这种方法的优点是,您几乎可以将此方法中的重定向代码块复制并粘贴到您想以相同方式修改的任何其他方法中。