【问题标题】:how to use Invoke method in a file of extensions/methods?如何在扩展/方法文件中使用调用方法?
【发布时间】:2011-12-16 16:39:58
【问题描述】:

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

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

抱歉,打错了。我在论坛上输入了这个代码。 错误继续。

根据documentation,使用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

我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 可以使用已有的Action委托;你不需要创建自己的。
  • 也许,(label.TopLevelControl as Form).Invoke

标签: c# .net multithreading invoke invokerequired


【解决方案1】:

为什么不这样做:

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

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

【讨论】:

    【解决方案2】:

    改变

    Invoke((UpdateState)delegate …
    

    label.Invoke((UpdateState)delegate …
    

    【讨论】:

    • 没错。您需要的“Invoke”方法是 System.Windows.Forms.Control 类的成员,Label 是从该类派生的。您的静态 LabelExtensions 类没有“Invoke”方法。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      InvokeControl实例方法
      你需要一个Control 来调用它,比如你的label

      【讨论】:

        【解决方案5】:

        您无需声明新的委托类型,也无需构造新的 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;
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-23
          • 1970-01-01
          • 2015-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多