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
}));