Dispatcher.BeginInvoke: невозможно преобразовать лямбду в System.Delegate - PullRequest
71 голосов
/ 08 февраля 2011

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

BeginInvoke(Delegate method, params object[] args)

Я пытаюсь передать ему лямбду вместо того, чтобы создавать делегат.

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

Это дает мне ошибку компилятора, говорячто я

не могу преобразовать лямбду в System.Delegate.

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

Ответы [ 5 ]

67 голосов
/ 06 октября 2011

Короче:

_dispatcher.BeginInvoke((Action)(() => DoSomething()));
67 голосов
/ 08 февраля 2011

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

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

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

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

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

_dispatcher.BeginInvoke(new Action(this.DoSomething));
5 голосов
/ 07 января 2016

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

Dispatcher.BeginInvoke((Action)(()=>{
  //Write Code Here
}));
5 голосов
/ 24 ноября 2014

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

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});
1 голос
/ 17 мая 2018

Мы создаем методы расширения для этого. Э.Г.

public static void BeginInvoke(this Control control, Action action)
    => control.BeginInvoke(action);

Теперь мы можем вызвать его из формы: this.BeginInvoke(() => { ... }).

...