Dispatcher.BeginInvoke: невозможно преобразовать lambda в System.Delegate

Я пытаюсь позвонить System.Windows.Threading.Dispatcher.BeginInvoke. Подпись метода такова:

BeginInvoke(Delegate method, params object[] args)

Я пытаюсь передать ему Lambda вместо создания делегата.

_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );

Это дает мне ошибку компилятора, говоря, что я не могу преобразовать лямбда в System.Delegate. Подпись делегата принимает объект как параметр и возвращает void. Моя лямбда соответствует этому, но он не работает. Что мне не хватает?

Ответ 1

Так как метод принимает System.Delegate, вам нужно указать ему определенный тип делегата, объявленный как таковой. Это можно сделать с помощью создания или создания указанного делегата через новый DelegateType следующим образом:

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     new object[] { this } 
  );

Кроме того, поскольку SLaks указывает, Dispatcher.BeginInvoke принимает массив params, поэтому вы можете просто написать:

_dispatcher.BeginInvoke(
     new Action<MyClass>((sender) => { DoSomething(); }),
     this
  );

Или, если DoSomething - это метод для этого объекта:

_dispatcher.BeginInvoke(new Action(this.DoSomething));

Ответ 2

Короче:

_dispatcher.BeginInvoke((Action)(() => DoSomething()));

Ответ 3

Если вы ссылаетесь на System.Windows.Presentation.dll из вашего проекта и добавляете using System.Windows.Threading, вы можете получить доступ к методу расширения, который позволяет использовать синтаксис лямбда.

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});

Ответ 4

Использование Inline Lambda...

Dispatcher.BeginInvoke((Action)(()=>{
  //Write Code Here
}));