web-dev-qa-db-fra.com

Dispatcher.BeginInvoke: impossible de convertir lambda en System.Delegate

J'essaie d'appeler System.Windows.Threading.Dispatcher.BeginInvoke. La signature de la méthode est la suivante:

BeginInvoke(Delegate method, params object[] args)

J'essaie de lui passer une Lambda au lieu d'avoir à créer un délégué.

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

Cela me donne une erreur de compilation disant que je

ne peut pas convertir le lambda en System.Delegate.

La signature du délégué prend un objet comme paramètre et renvoie void. Mon lambda correspond à cela, mais cela ne fonctionne pas. Qu'est-ce que je rate?

71
Micah

Comme la méthode prend un System.Delegate , vous devez lui donner un type spécifique de délégué, déclaré comme tel. Cela peut être fait via un cast ou une création du délégué spécifié via le nouveau DelegateType comme suit:

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

De plus, comme SLaks le fait remarquer, Dispatcher.BeginInvoke prend un tableau de paramètres, vous pouvez donc simplement écrire:

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

Ou, si DoSomething est une méthode sur cet objet lui-même:

_dispatcher.BeginInvoke(new Action(this.DoSomething));
68
Reed Copsey

Plus court:

_dispatcher.BeginInvoke((Action)(() => DoSomething()));
67
Erwin Mayer

Utilisation de Lambda en ligne ...

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

Si vous référencez System.Windows.Presentation.dll à partir de votre projet et ajoutez using System.Windows.Threading alors vous pouvez accéder à une méthode d'extension qui vous permet d'utiliser la syntaxe lambda.

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});
5
logicnet.dk

Nous créons des méthodes d'extension pour cela. Par exemple.

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

Maintenant, nous pouvons l'appeler à partir d'un formulaire: this.BeginInvoke(() => { ... }).

1
Shaun Luttin