dispatcher.invoke和lambda语法 - 新操作



之间有什么区别
Application.Current.Dispatcher.Invoke(
    new Action(() =>
    {
        txtRowCount.Text = string.Format("{0}", rowCount);
    })
); //end-Invoke

vs

Application.Current.Dispatcher.Invoke(
    () =>
    {
        txtRowCount.Text = string.Format("{0}", rowCount);
    }
); //end-Invoke

如果编译器抱怨,我会使用另一个,但我不知道到底发生了什么。

这很可能取决于您正在调用哪种方法并将代表传递给。例如,具有这样的签名的方法可以使用lambda隐式创建Action

void RunAction(Action thing) {}

虽然这样的方法将无法弄清楚您想要哪种类型的委托:

void RunDelegate(Delegate thing) {}

的原因是Delegate类型是可以代表任何delegate表达式的基类。例如,您可以将第二个功能传递给ActionFunc<T>Predicate<T>EventHandler或您可以想到的任何其他委托,包括自定义委托。在这种情况下,编译器/运行时不知道该将自定义委托的转换为什么。该职能是弄清楚如何致电代表或不理解异常的责任。

另一方面,Action是没有参数且未返回值的方法的特定委托:

delegate void Action();

因此,当方法的参数键入为 Action时,则可以将符合该委托的签名的任何lambda隐式转换为您。


对于采用DelegateDispatcher.BeginInvoke方法,您可以将其传递给任何0个参数的委托(如果它返回某物,则可以,但是我怀疑返回值是否用于任何内容)。因此,您可以将其传递到ActionFunc<T>之类的东西。如果您将其传递给期望传递的参数的委托,它仍将编译,但是当调度员尝试调用该方法时,在运行时会引发例外。

要演示,我制作了一个快速的小控制台应用。

static int Main(string[] args)
{
    // These work
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Console.WriteLine("Action")));
    Dispatcher.CurrentDispatcher.BeginInvoke(new Func<int>(() => { Console.WriteLine("Func<int>"); return 42; }));
    // This one throws a TargetParameterCountException when the dispatcher gets to it
    //Dispatcher.CurrentDispatcher.BeginInvoke(new Action<bool>(b => Console.WriteLine("Action<bool>")));
    // Queue a dispatcher shutdown at the end and run the dispatcher
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => Dispatcher.CurrentDispatcher.InvokeShutdown()));
    Dispatcher.Run();
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新