【问题标题】:Why doesn't Dispatcher.BeginInvoke take an Action as a parameter?为什么 Dispatcher.BeginInvoke 不将 Action 作为参数?
【发布时间】:2018-10-26 19:11:43
【问题描述】:

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 参数有什么原因吗?

【问题讨论】:

  • 您必须询问 API 设计人员才能确定,其他人无法判断。也许他们只是没有考虑过。这很糟糕,但你可以定义一个扩展方法来规避它。
  • 微软程序员从 2002 年 6 月开始编写 WPF 代码,.NET 1.0 才刚刚发布。没有什么是你不能用扩展方法解决的。
  • 您可能想使用 .Net 4.5 中引入的Dispatcher.InvokeAsync。这应该可以满足您的所有需求,并使生活更轻松。

标签: c# wpf


【解决方案1】:

这是一个设计决定。由于 WPF 是随 .NET 3.0 一起提供的,而且 WPF 可能是在几年内开发的,所以可能像 ActionAction<T>... 或 Func<T>... 这样的代表没有在早期的 .NET 3.0 alpha 中添加,所以他们离开了使用他们自己的委托编写代码。

另一方面,您认为您需要执行 cast 而您应该实例化 Action

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多