Dispatcher.Invoke avec un délégué anonyme fonctionne dans Silverlight mais pas WPF
Dans Silverlight 4, j'ai un service personnalisé de classe qui a un asynchrones événement Terminé. À l'intérieur de l'événement Terminé je prends les données renvoyées et appeler une méthode peupler par quelque chose comme ceci:
private void service_Completed(object sender, CompletedEventArgs args)
{
Dispatcher.BeginInvoke(() => populateInbox(args.Jobs));
}
private void populateInbox(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
}
La BeginInvoke
travaille dans le SL4, cependant lorsque je l'ai porté sous WPF j'obtiens l'erreur suivante:
Ne peut pas convertir expression lambda de type 'System.Délégué " parce qu'il n'est pas un type délégué
J'ai essayé de le changer pour un en ligne, anonyme, paramaterized délégué:
Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
inbox.DataContext = jobs;
});
Cependant, qui permet de faire la même erreur de compilation.
Aucune idée comment faire pour obtenir que cela fonctionne dans WPF? Refactorisation pour utiliser le BackgroundWorker
n'est pas une option pour moi.
source d'informationauteur Edward J. Stembler
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier un type délégué explicite. Il suffit d'utiliser une
Action
.Vous pouvez, cependant, d'éviter d'avoir à fermer sur le
args.Jobs
valeur comme ceci:C'est parce que le seul paramètre de la version de
Dispatcher.BeginInvoke
a une signature différente dans Silverlight que dans WPF. Dans Silverlight, il prend unAction
ce qui permet au compilateur C# implicite de type de votre lambda comme unAction
. Dans WPF, il faut unDelegate
(à l'instar de sesControl.BeginInvoke
analogique en Winforms), de sorte que le compilateur C# doit avoir un délégué de type spécifié explicitement.En WPF et winforms, vous devez la convertir en une MethodInvoker d'abord, sinon vous obtenez le message d'erreur Ne peut pas convertir méthode anonyme de type 'System.Délégué " parce qu'il n'est pas un type délégué.
Pour plus d'info: http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx