Próbuję zadzwonić System.Windows.Threading.Dispatcher.BeginInvoke
. Podpis metody jest następujący:
BeginInvoke(Delegate method, params object[] args)
Próbuję przekazać mu Lambdę zamiast tworzyć delegata.
_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );
Daje mi błąd kompilatora mówiący, że ja
nie można przekonwertować lambdy na System.Delegate.
Podpis delegata przyjmuje obiekt jako parametr i zwraca void. Moja lambda pasuje do tego, ale nie działa. czego mi brakuje?
źródło
Invoke
iBeginInvoke
weź ogólnyDelegate
obiekt, który może reprezentować metodę dowolnego podpisu. W normalnych okolicznościach (gdy delegat jest silnie wpisany do określonego podpisu), kompilator może wywnioskować określony typ delegata. Dlatego możesz pominąć typ delegata w innych scenariuszach. Jednak, ponieważ nie ma żadnego rzeczywistego typ delegata tutaj, kompilator nie ma wystarczających podstaw (lub, naprawdę, nawet środki ), aby użyć, aby wybrać typ delegata.Krótszy:
źródło
_dispatcher.BeginInvoke((Action)(DoSomething));
Korzystanie z wbudowanej sondy Lambda ...
Dispatcher.BeginInvoke((Action)(()=>{ //Write Code Here }));
źródło
Jeśli odwołujesz się do System.Windows.Presentation.dll z projektu i dodajesz
using System.Windows.Threading
, możesz uzyskać dostęp do metody rozszerzenia, która umożliwia użycie składni lambda.using System.Windows.Threading; ... Dispatcher.BeginInvoke(() => { });
źródło
W tym celu tworzymy metody rozszerzające. Na przykład
public static void BeginInvoke(this Control control, Action action) => control.BeginInvoke(action);
Teraz możemy nazwać go od wewnątrz postaci:
this.BeginInvoke(() => { ... })
.źródło