82 votes

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

Je suis en train d'essayer d'appeler System.Windows.Threading.Dispatcher.BeginInvoke. La signature de la méthode est la suivante :

BeginInvoke(Delegate method, params object[] args)

Je cherche à lui passer un Lambda au lieu de devoir créer un Delegate.

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

Il me donne une erreur de compilation indiquant que je

ne peux pas convertir le lambda en System.Delegate.

La signature du delegate prend un objet en tant que paramètre et retourne void. Mon lambda correspond à cela, pourtant ça ne fonctionne pas. Qu'est-ce que j'oublie ?

0 votes

73voto

Erwin Mayer Points 3427

Plus court :

_dispatcher.BeginInvoke((Action)(() => DoSomething()));

8 votes

Encore plus court : Je ne pense pas que vous ayez besoin des accolades {} et du point-virgule autour de l'expression.

3 votes

Vous n'avez même pas besoin de (), donc cela peut être _dispatcher.BeginInvoke((Action)(DoSomething));

0 votes

Ou même _dispatcher.BeginInvoke(DoSomething);

72voto

Reed Copsey Points 315315

Étant donné que la méthode prend un System.Delegate, vous devez lui donner un type spécifique de délégué, déclaré en tant que tel. Ceci peut être fait via un cast ou une création du délégué spécifié via new DelegateType comme suit:

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

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

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

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

_dispatcher.BeginInvoke(new Action(this.DoSomething));

3 votes

Mais est-ce que (x) => { DoSomething(); } correspond à la signature du délégué? Je pensais que c'est tout ce que je devrais spécifier.

0 votes

@Micah: System.Delegate n'a pas de signature - c'est simplement "n'importe quel délégué" tout simplement. Vous devez lui fournir un type de délégué avec une signature qui correspond à votre utilisation.

0 votes

@Reed Mais si au lieu de MyMethod(Action action) (et Action est un délégué) je peux appeler MyMethod(() => { DoSomething(); }); Pourquoi ne puis-je pas faire la même chose pour BeginInvoke?

10voto

John Peters Points 3662

Utilisation de Lambda en ligne...

Dispatcher.BeginInvoke((Action)(()=>{
  //Écrire du code ici
}));

8voto

logicnet.dk Points 163

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

using System.Windows.Threading;

...

Dispatcher.BeginInvoke(() =>
{
});

5voto

Shaun Luttin Points 1585

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 depuis un formulaire : this.BeginInvoke(() => { ... }).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X