c# - Dispatcher.Invoke with anonymous delegate 在 Silverlight 中有效但在 WPF 中无效

标签 c# wpf asynchronous begininvoke anonymous-delegates

在 Silverlight 4 中,我有一个自定义服务类,它有一个异步的 Completed 事件。在 Completed 事件中,我获取返回的数据并通过如下方式调用填充方法:

private void service_Completed(object sender, CompletedEventArgs args)
{
    Dispatcher.BeginInvoke(() => populateInbox(args.Jobs));
}

private void populateInbox(List<JobViewModel> jobs)
{
    inbox.DataContext = jobs;
}

BeginInvoke 在 SL4 中工作,但是当我将它移植到 WPF 时,出现以下错误:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

我尝试将其更改为内联的、匿名的、参数化的委托(delegate):

Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
    inbox.DataContext = jobs;
});

但是,这会产生相同的编译时错误。

知道如何让它在 WPF 中工作吗?重构以使用 BackgroundWorker 对我来说不是一个选项。

最佳答案

您需要指定一个明确的委托(delegate)类型。只需使用一个Action

Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs));

但是,您可以避免像这样关闭 args.Jobs 值:

Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs);

这是因为 Dispatcher.BeginInvoke 的单参数版本在 Silverlight 中的签名与在 WPF 中的签名不同。在 Silverlight 中,它需要一个 Action,它允许 C# 编译器将您的 lambda 隐式键入为 Action。在 WPF 中,它需要一个 Delegate(就像它在 Winforms 中的 Control.BeginInvoke 模拟),因此 C# 编译器必须明确指定一个委托(delegate)类型。

关于c# - Dispatcher.Invoke with anonymous delegate 在 Silverlight 中有效但在 WPF 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284518/

相关文章:

c# - 任务的返回类型错误

Javascript for循环等待回调

android - RxJava2 : execute an async function for every item in a list and wait for callback

c# - 需要了解这个WPF程序中的事件触发。 .

WPF - 如何制作自定义边框

c# - asp.net c# 中是否有等效的 echo

c# - 使用数据库的 FluentValidation 唯一名称验证

apache-flex - 处理异步控制结构(Fluent Interface?)

c# - 获取任何文件的缩略图,包括 Windows XP/Vista 上的 SolidWorks

c# - 访问 View 模型类中的选项卡控件