Ich versuche anzurufen System.Windows.Threading.Dispatcher.BeginInvoke
. Die Signatur der Methode lautet:
BeginInvoke(Delegate method, params object[] args)
Ich versuche, ihm einen Lambda zu übergeben, anstatt einen Delegierten erstellen zu müssen.
_dispatcher.BeginInvoke((sender) => { DoSomething(); }, new object[] { this } );
Es gibt mir einen Compilerfehler, der besagt, dass ich
Das Lambda kann nicht in ein System.Delegate konvertiert werden.
Die Signatur des Delegaten nimmt ein Objekt als Parameter und gibt void zurück. Mein Lambda passt dazu, aber es funktioniert nicht. Was vermisse ich?
quelle
Invoke
undBeginInvoke
nehmen Sie ein generischesDelegate
Objekt, das eine Methode jeder Signatur darstellen kann. Unter normalen Umständen (wenn ein Delegat stark an eine bestimmte Signatur gebunden ist) kann der Compiler auf den bestimmten Delegatentyp schließen. Aus diesem Grund können Sie den Delegatentyp in anderen Szenarien weglassen. Da es hier jedoch keinen tatsächlichen Delegatentyp gibt, verfügt der Compiler nicht über eine vernünftige Grundlage (oder sogar ein Mittel ), um einen Delegatentyp auszuwählen.Kürzere:
quelle
_dispatcher.BeginInvoke((Action)(DoSomething));
Inline Lambda verwenden ...
Dispatcher.BeginInvoke((Action)(()=>{ //Write Code Here }));
quelle
Wenn Sie in Ihrem Projekt auf System.Windows.Presentation.dll verweisen und hinzufügen
using System.Windows.Threading
, können Sie auf eine Erweiterungsmethode zugreifen, mit der Sie die Lambda-Syntax verwenden können.using System.Windows.Threading; ... Dispatcher.BeginInvoke(() => { });
quelle
Hierfür erstellen wir Erweiterungsmethoden. Z.B
public static void BeginInvoke(this Control control, Action action) => control.BeginInvoke(action);
Jetzt können wir es aus einem Formular heraus aufrufen :
this.BeginInvoke(() => { ... })
.quelle