Invoquant Répartiteur WPF avec méthode anonyme
Je viens de réaliser en C# .Net WPF 4.0 thread d'arrière-plan que cela ne fonctionne pas (erreur de compilation):
Dispatcher.Invoke(DispatcherPriority.Normal, delegate()
{
//do stuff to UI
});
À partir de quelques exemples, j'ai trouvé qu'elle avait d'être castée comme ceci: (Action)delegate()
. Cependant, dans d'autres exemples, il est coulé à d'autres classes, par exemple System.Windows.Forms.MethodInvoker
.
Quelqu'un peut-il me dire quel est exactement le problème avec l'exemple ci-dessus? J'ai aussi essayé de le reproduire avec d'autres méthodes, mais il a toujours travaillé sans casting:
delegate void MyAction();
void Method1(MyAction a) {
//do stuff
}
void Method2(Action a) {
//do stuff
}
void Tests()
{
Method1(delegate()
{
//works
});
Method2(delegate()
{
//works
});
Method1(() =>
{
//works
});
Method2(() =>
{
//works
});
Method2(new Action(delegate()
{
//works
}));
new System.Threading.Thread(delegate()
{
//works
}).Start();
}
Ainsi quel est le meilleur (le plus élégant, moins redondant) pour appeler l'expéditeur, et quoi de si spécial avec elle que les délégués doivent être coulé?
OriginalL'auteur Hannobo | 2011-06-05
Vous devez vous connecter pour publier un commentaire.
Regarde le signature de
Dispatcher.Invoke()
. Il ne prend pasAction
ou quelque autre type de délégué. Il fautDelegate
, qui est l'ancêtre commun de tous les types délégués. Mais vous ne pouvez pas convertir méthode anonyme à ce type de base directement, vous pouvez convertir seulement à certains type de délégué. (La même chose s'applique pour les lambdas et de la méthode des groupes.)Pourquoi faut-il
Delegate
? Parce que vous pouvez passer délégués qui prennent des paramètres ou ont des valeurs de retour.La façon la plus propre est probablement:
Vous pouvez utiliser une méthode, par exemple, l'Action Action = MyMethod;
OriginalL'auteur svick
Je tiens à souligner encore plus le nettoyant exemple de code pour Svick, après tout nous sommes tous comme l'un des paquebots de ne pas nous?
Servy: Oui, j'ai totalement raté la phrase où le boursier poser cette question en fait des réponses à sa propre question.. désolé 🙁
+1 - je suis partiellement en désaccord avec Servy. Jaska, merci de modifier votre réponse c'est donc en toute confiance dire: c'est de la façon la plus propre à impliquer méthode anonyme. Votre réponse est exactement la réponse à la question du titre: "l'Invocation Répartiteur WPF avec méthode anonyme." - Merci, vous pour qui.
OriginalL'auteur Jaska
Le Délégué de classe est
abstract
de sorte que vous avez à offrir le compilateur avec un type qui en est dérivé. Toute classe dérivée de Délégué vais faire, mais l'Action est généralement le plus approprié.delegate {}
regarde comme c'est déjà de type dérivé de l'Delegate
, de sorte que votre réponse n'explique pas pourquoi le plâtre nécessaire.délégué (minuscule) est un mot clé c#, pas une classe. C'est un très commune de la confusion.
Je n'ai pas parler d'un type
delagate
(vous avez raison, ce type n'existe pas), je parlais de l'expressiondelegate { }
, qui déclare une méthode anonyme, il est donc logique de penser que l'expression peut être convertie implicitement àDelegate
.oui, mais la question que le compilateur de déduire est ce que type de déléguer votre méthode doit être. il ne peut pas être de type Délégué parce que c'est abstrait. le compilateur pourrait probablement être donné une certaine intelligence de créer un anonyme sous-classe de Délégué basé sur votre paramètre et types de retour (le cas échéant), puis de lancer pour que votre nom... mais comme de .NET 4, ils ne l'ont pas fait. peut-être que la prochaine fois?
oui, c'était mon point de vue et je pense qu'il n'est pas évident de votre réponse.
OriginalL'auteur Robert Levy
J'utilise celui-ci:
Dispatcher.Invoke((Action)(() => YourCodeHere()));
OriginalL'auteur Joe Sonderegger