В 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, я получаю следующую ошибку:
Не может преобразовать лямбда-выражение для ввода 'Системы. Делегат', потому что это не тип делегата
Я пытался изменить его на встроенного, анонимного, параметризованного делегата:
Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
Однако это приводит к той же ошибке времени компиляции.
Какая-либо идея, как заставить это работать в WPF? Рефакторинг для использования BackgroundWorker
не опция для меня.
Вам необходимо указать явный тип делегата. Просто используйте действие
.
Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs));
Однако вы можете избежать закрытия значения args.Jobs
следующим образом:
Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs);
Это связано с тем, что однопараметрическая версия Dispatcher.BeginInvoke
имеет другая подпись в Silverlight, чем в WPF. В Silverlight требуется действие
, которое позволяет компилятору C # неявно вводить лямбда-выражение как действие
. В WPF требуется делегат
(как и его аналог Control.BeginInvoke
в Winforms), поэтому компилятор C # должен явно указывать тип делегата.