MaterialDesignInXAML / MaterialDesignInXAML/MaterialDesignInXamlToolkit

DialogHost can throw exception when opening and closing dialog in quick succession

Ouverte
#1,054 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug evaluation required
Langage dominant
C#
Étoiles
16.3k
Forks
3.5k
Merge moyen
1 j 22 h
PR mergées (30 j)
8

Description

DialogHost can throw exception when opening and closing dialog in quick succession.

## Background

I have a view which is password protected. The password dialog is shown when the user opens the view. The dialog is using a `DialogHost` placed on the view and is the only "client" of the dialog host. If the user navigates away from the view, the dialog will be closed.

## Problem

If the dialog is shown and the user navigates away from the view shortly after there is a chance that the `DialogHost` will throw a `NullReferenceException`.

```
2018-10-04 09:02:10.870 +02:00 [Error ] [02] Unhandled exception occurred. Origin=System.Threading.Tasks.TaskScheduler.UnobservedTaskException,
System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at MaterialDesignThemes.Wpf.DialogHost.<>c__DisplayClass38_1.b__2(Task t) in C:\projects\materialdesigninxamltoolkit\MaterialDesignThemes.Wpf\DialogHost.cs:line 296
at System.Threading.Tasks.ContinuationResultTaskFromTask`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of inner exception stack trace ---
---> (Inner Exception #0) System.NullReferenceException: Object reference not set to an instance of an object.
at MaterialDesignThemes.Wpf.DialogHost.<>c__DisplayClass38_1.b__2(Task t) in C:\projects\materialdesigninxamltoolkit\MaterialDesignThemes.Wpf\DialogHost.cs:line 296
at System.Threading.Tasks.ContinuationResultTaskFromTask`1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()<---
```

My guess is that since there is a delay when opening a dialog it is possible that some reference become `null` during the delay. I think that the `child` variable should not change value but it could be possible that its `Dispatcher` property becomes `null` when the object is removed from visual tree or something like that.

Anyway, the code might need some more protective `null` checking.

```
dialogHost.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
CommandManager.InvalidateRequerySuggested();
UIElement child = dialogHost.FocusPopup();

if (child != null)
{
//https://github.com/ButchersBoy/MaterialDesignInXamlToolkit/issues/187
//totally not happy about this, but on immediate validation we can get some weird looking stuff...give WPF a kick to refresh...
Task.Delay(300).ContinueWith(t => child.Dispatcher.BeginInvoke(new Action(() => child.InvalidateVisual())));
}
}));
```

see [DialogHost.cs](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/blob/master/MaterialDesignThemes.Wpf/DialogHost.cs#L289-L300)

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans MaterialDesignThemes.Wpf/DialogHost.cs autour des lignes 289–300, en particulier au niveau de la continuation différée dans IsOpenPropertyChangedCallback. Reproduisez une séquence rapide d’ouverture puis de fermeture, ou de navigation vers une autre vue, et déterminez quelle référence peut devenir indisponible pendant le délai. C’est terminé lorsque la séquence ne produit plus la NullReferenceException signalée ni d’exception de tâche non observée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp
Domaine
desktop
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.