MethodInvoker与新的MethodInvoker

时间:2014-11-07 15:53:58

标签: c# multithreading asynchronous delegates

我正在维护voip多线程窗口表单应用程序,我可以理解当我们不想定义委托但希望使用委托将数据从工作线程路由到gui线程时使用MethodInvoker所以这段代码有意义< / p>

 void Synch_ProgressComplete(bool Success)
    {
        _SynchPseudoGauge = 100;

        if (this.InvokeRequired)
            this.Invoke((MethodInvoker)
                (() => { SynchProgressBar.Value = _SynchPseudoGauge; }));
        else
            SynchProgressBar.Value = _SynchPseudoGauge;

        _LastSynchAvailability = _Synch.Available;

        if (this.InvokeRequired)
            this.Invoke((MethodInvoker)
                (() => { WebserviceAvailibilityLabel.ForeColor = Success ? Color.Black : Color.Red; }));
        else
            WebserviceAvailibilityLabel.ForeColor = Success ? Color.Black : Color.Red;


        if (this.InvokeRequired)
            this.Invoke((MethodInvoker)
                (() => { WebserviceAvailibilityLabel.Text = Success ? "Webservice Available" : "Webservice Error"; }));
        else
            WebserviceAvailibilityLabel.Text = Success ? "Webservice Available" : "Webservice Error";

但我不明白这一点

  SynchroniseDelegate SynchDelegate = new SynchroniseDelegate(_Synch.Synchronise);
                AsyncCallback SynchCallback = new AsyncCallback(Synch_Callback);
AsyncCallback SynchCallback = new AsyncCallback(Synch_Callback);
   SynchDelegate.BeginInvoke(Synchronisation.ForceSync.All, SynchCallback, new object() { });

private void Synch_Callback(IAsyncResult ar)
        {
            this.Invoke(new MethodInvoker(InitialiseTelephony), new object() { });
        }

任何人都可以帮助

2 个答案:

答案 0 :(得分:2)

在上面的代码片段中,作者希望创建一个给定lambda表达式的委托。 Lambda表达式没有CLR类型(它们没有委托类型)。不过,他们可以转换为代表。

在一种情况下,lambda将转换为委托类型。在另一种情况下,构造函数语法用于执行转换。这两个变体做同样的事情。你可以做任何你喜欢的事。

答案 1 :(得分:2)

将方法转换为委托类型,如第一个示例中所做的那样,在功能上与第二个示例中使用的类似构造函数的语法相同。