Диспетчер. Вызовите с анонимными работами делегата в Silverlight, но не WPF

В 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 не опция для меня.

10
задан Yaur 10 August 2012 в 18:42
поделиться

1 ответ

Вам необходимо указать явный тип делегата. Просто используйте действие .

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 # должен явно указывать тип делегата.

26
ответ дан 3 December 2019 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: