C# : this.Invoke((MethodInvoker)delegate

9

有人能解释一下以下代码吗:

                this.Invoke((MethodInvoker)delegate
                {
                    lblNCK.Text = cncType;
                });

这是它的来源:
        string cncType;

        if (objDMainCncData != null)
        {
            int rc = objDMainCncData.Init(objDGroupManager.Handle);

            if (rc == 0)
            {
                cncType = objDMainCncData.GetCncIdentifier();

                if (cncType != string.Empty)
                {
                    if (cncType.ToUpper().IndexOf("+") != -1)
                        _bFXplus = true;

                    this.Invoke((MethodInvoker)delegate
                    {
                        lblNCK.Text = cncType;
                    });
                }
            }
            else
            {
                DisplayMessage("objDMainCncData.Init() failed ! error : " + rc.ToString());
            }
        }
    }

我不明白 "this.Invoke((MethodInvoker)delegate" 的用途。
提前感谢您。
彼得。
1个回答

24

很奇怪没人回答这个问题。

让我们分开来看:

this.Invoke:这是一种同步机制,包含在所有控件中。所有图形/ GUI更新必须仅从GUI线程执行。(这很可能是主线程。)因此,如果您有其他线程(例如工作线程、异步函数等)会导致GUI更新,则需要使用Invoke。否则程序将崩溃。

delegate{...}:这是一个匿名函数。您可以将其视为“即兴创建一个函数”。 (而不是在代码中找到空间,创建函数名称、参数等。)

(MethodInvoker):MethodInvoker只是Invoke期望的委托名称。例如,Invoke期望被给予具有与“MethodInvoker”函数相同签名的函数。

发生的情况是,Invoke被给予一个函数指针。它通过互斥机制唤醒GUI线程并告诉它执行该函数(通过函数指针)。父线程然后等待GUI线程完成执行。就这样。


1
附加信息:表示一个委托,它可以执行在托管代码中声明为void且不带参数的任何方法。 https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.methodinvoker?view=netframework-4.8 - Soner from The Ottoman Empire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接