为什么Dispatcher.BeginInvoke不将Action作为参数?

时间:2015-08-09 17:39:33

标签: c# wpf

Dispatcher。Invoke方法可以将DelegateAction实例作为参数。 但Dispatcher。BeginInvoke方法不接受Action实例;它仅支持Delegate

它强制我在BeginInvoke的情况下将一个lambda表达式强制转换为Action。 例如:

Dispatcher.Invoke(() => Title = "foo"); // success
// Dispatcher.BeginInvoke(() => Title = "foo"); // error
Dispatcher.BeginInvoke((Action)(() => Title = "foo")); // success

Dispatcher.BeginInvoke方法有没有理由不采用Action参数?

1 个答案:

答案 0 :(得分:0)

这是一项设计决定。由于WPF附带了.NET 3.0,并且可能WPF是在几年内开发的,因此可能会在早期添加ActionAction<T> ...或Func<T>等代表。 .NET 3.0 alphas,所以他们使用自己的委托离开了代码。

另一方面,你认为你需要执行强制转换而你应该实例化Action

// This is possible!
Delegate d1 = new Action(() => Console.WriteLine("hello world"));

Dispatcher.BeginInvoke(new Action(() => { /* ---do stuff--- */ }));