在 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/