簡體   English   中英

具有匿名委托的Dispatcher.Invoke適用於Silverlight但不適用於WPF

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM