Expression lambda et memory leak
Bonjour à tous,
J'ai pu parler rapidement de cela sur la page Facebook Silverlight il y a quelque temps et depuis je me pose des questions car j'avoue être un peu embrouillé par tout ça.
Prenons un exemple qui pour moi apparaît souvent dans mes codes, et qui après tout ce que j'ai pu lire (et essayer de comprendre) pourrait être une mauvaise pratique.
Ici on detecte un appuis sur un bouton permettant de delete un objet, avec bien sur, demande de confirmation à l'utilisateur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| private void Bt_Delete_Click(object sender, RoutedEventArgs re)
{
if (SelectedObject !=null)
{
//Ask confirmation to the user
ConfirmChildWindow _confirmChildWindow = new ConfirmChildWindow("Are you sure to Delete the object ?");
_confirmChildWindow.Closed += (o, e) =>
{
//If yes
if (_confirmChildWindow.DialogResult == true)
{
//Remove it to the DBContext
DBContext.Objects.Remove(SelectedObject);
DBContext.SubmitChanges().Completed += (o1, e1) =>
{
//And then when it remove we reload all the Object
//Load bar during the load of the Objects
Pb_LoadingObject.Visibility = Visibility.Visible;
//load all the Object
LoadOperation _ObjectLoadOperation = DBContext.Load(DBContext.GetObjectQuery(SelectedOtherObject.ID));
Cb_Object.ItemsSource = _ObjectLoadOperation .Entities;
_ObjectLoadOperation .Completed += (o2, e2) =>
{
Pb_LoadingObject.Visibility = Visibility.Collapsed;
InfoChildWindow _infoChildWindow = new InfoChildWindow("The Object has been deleted !");
};
};
UnCheckAllCheckBox();
}
//if not
else
{
}
};
}
} |
On voit donc ici que lors d'un click sur le bouton, on demande la confirm à l'utilisateur => 1ère lambda pour le Closed, puis on le remove du DBContext => 2éme lambda pour le submit Completed.
Pour mon DBcontext à la rigueur, comme il est déclarer dans ma page, sa durée de vie de vie dépasse la durée de fonction elle même si j'ai bien compris, donc cela ne pose pas trop de problème pour la lambda avec ma confirmChildWindow, j'ai vu ici que cela pouvais poser des problèmes.
Alors je me dis qu'avec tout ça, mon "enchevêtrement" de lambda genre poupées Gigognes été peut être quelque choses à proscrire non ??
Bref je suis un peu perdu dans tout ça et j'attends vos avis d'expert