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
表达式的基类。例如,您可以将第二个功能传递给Action
,Func<T>
,Predicate<T>
,EventHandler
或您可以想到的任何其他委托,包括自定义委托。在这种情况下,编译器/运行时不知道该将自定义委托的转换为什么。该职能是弄清楚如何致电代表或不理解异常的责任。
另一方面,Action
是没有参数且未返回值的方法的特定委托:
delegate void Action();
因此,当方法的参数键入为 Action
时,则可以将符合该委托的签名的任何lambda隐式转换为您。
对于采用Delegate
的Dispatcher.BeginInvoke
方法,您可以将其传递给任何0个参数的委托(如果它返回某物,则可以,但是我怀疑返回值是否用于任何内容)。因此,您可以将其传递到Action
或Func<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;
}