Edw*_*ler 10 c# wpf asynchronous begininvoke anonymous-delegates
在Silverlight 4中,我有一个自定义服务类,它有一个异步的Completed事件.在Completed事件中,我获取返回的数据并通过以下方式调用populate方法:
private void service_Completed(object sender, CompletedEventArgs args)
{
Dispatcher.BeginInvoke(() => populateInbox(args.Jobs));
}
private void populateInbox(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
}
Run Code Online (Sandbox Code Playgroud)
BeginInvokeSL4中的工作,但是当我将它移植到WPF时,我收到以下错误:
无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型
我尝试将其更改为一个内联的,匿名的,参数化的代表:
Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
Run Code Online (Sandbox Code Playgroud)
但是,这会产生相同的编译时错误.
知道如何在WPF中使用它吗?重构使用BackgroundWorker它不是我的选择.
Ada*_*son 26
您需要指定显式委托类型.只需使用一个Action.
Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs));
Run Code Online (Sandbox Code Playgroud)
但是,您可以避免args.Jobs像这样关闭值:
Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs);
Run Code Online (Sandbox Code Playgroud)
这是因为单参数版本Dispatcher.BeginInvoke在Silverlight中具有与WPF中不同的签名.在Silverlight中,它需要一个Action,它允许C#编译器隐式地将你的lambda键入为Action.在WPF中,它需要一个Delegate(就像它Control.BeginInvoke在Winforms中的模拟一样),因此C#编译器必须明确指定一个委托类型.