[英]Dispatcher.Invoke with anonymous delegate works in Silverlight but not WPF
在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;
}
BeginInvoke
在SL4中工作,但是當我將它移植到WPF時,我收到以下錯誤:
無法將lambda表達式轉換為類型'System.Delegate',因為它不是委托類型
我嘗試將其更改為一個內聯的,匿名的,參數化的代表:
Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
但是,這會產生相同的編譯時錯誤。
知道如何在WPF中使用它嗎? 重構使用BackgroundWorker
不是我的選擇。
您需要指定顯式委托類型。 只需使用一個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#編譯器必須明確指定一個委托類型。
在WPF和winforms中,你必須首先將它轉換為MethodInvoker,否則你將得到錯誤無法將匿名方法轉換為類型'System.Delegate',因為它不是委托類型。
Dispatcher.BeginInvoke((MethodInvoker) delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
有關詳細信息: http : //msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.