为什么 Dispatcher.BeginInvoke 不将操作作为参数

本文关键字:作作 参数 操作 Dispatcher BeginInvoke 为什么 | 更新日期: 2023-09-27 18:07:13

Dispatcher.Invoke 方法可以将委托或操作实例作为参数。但是 Dispatcher.BeginInvoke 方法不接受 Action 实例;它仅支持委托。

它迫使我在 BeginVoke 的情况下将 lambda 表达式转换为 Action。例如:

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

Dispatcher.BeginInvoke 方法不能采用 Action 参数有什么原因吗?

为什么 Dispatcher.BeginInvoke 不将操作作为参数

这是一个

设计决策。由于 WPF 随 .NET 3.0 一起提供,并且可能是 WPF 是在几年内开发的,也许像 ActionAction<T> 这样的代表......或Func<T>...未在早期的 .NET 3.0 alpha 中添加,因此他们使用自己的委托离开代码。

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

// This is possible!
Delegate d1 = new Action(() => Console.WriteLine("hello world"));
Dispatcher.BeginInvoke(new Action(() => { /* ---do stuff--- */ }));