Nous utilisons des événements comme celui-ci lamda:En C#, comment un événement asynchrone terminé doit-il accéder aux propriétés de la classe appelante?
bookMarkClient.wmdeleteCompleted += (s, ea) =>
{
if (ea.Result = "Success")
{
foreach (BookMark bookMark in BookMarks)
{
if (bookMarkId == bookMark.bm_id)
{
BookMarks.Remove(bookMark);
OnNotifyPropertyChanged("BookMarks");
break;
}
}
}
};
bookMarkClient.wmdeleteBookMarkAsync(bookMarkId);
Toutefois, selon de nombreuses réponses sur stackoverflow ceux-ci ne peuvent pas être supprimés, de sorte que si je l'appelle à nouveau le code de mon événement est déclenché deux fois. Donc, je veux supprimer le code lambda et faire ceci:
//in the class constructor
bookMarkClient.wmdeleteBookMarkCompleted += new EventHandler<wmdeleteBookMarkCompletedEventArgs>(bookMarkClient_wmdeleteBookMarkCompleted);
//Proc on the same class
void bookMarkClient_wmdeleteBookMarkCompleted(object sender, wmdeleteBookMarkCompletedEventArgs e)
{
if (ea.Result = "Success")
{
foreach (BookMark bookMark in BookMarks)
{
if (bookMarkId == bookMark.bm_id)
{
BookMarks.Remove(bookMark);
OnNotifyPropertyChanged("BookMarks");
break;
}
}
}
}
//on button click
bookMarkClient.wmdeleteBookMarkAsync(bookMarkId);
CEPENDANT: la bookMarkId variable n'est plus disponible. Je comprends que c'est parce que l'événement lambda copie la variable dans la classe construite et la garde en vie pendant la durée de l'événement. Alors, comment faire la même chose?
J'ai essayé de définir une variable privée mais le test montre que cela peut être changé avant la réception du rappel! Cela s'appliquerait également à la collection appelée Bookmarks.
Remarque, Il s'agit d'un client Silverlight et je préfère ne pas renvoyer l'ID/collection dans les arguments d'événement car cela signifierait retravailler beaucoup de code wcf.
Merci beaucoup, Matt
ps premier poste à pile afin de prendre facilement sur moi ...
Merci, comme dans ma réponse à l'autre réponse, j'ai essayé de supprimer le lambda en utilisant une variable locale - avec des résultats mitigés. Votre solution semble faisable mais je ne suis pas sûr d'où déclarer l'écouteur, puis de +/- le gestionnaire. Si je l'ajoute, appelez la méthode async puis supprimez-la sur la ligne suivante, le callback n'est jamais reçu! Enfin, il me force à faire des marque-pages et onNotifyPropertyChanged public (pas idéal). Matt – MattPil29