Dispatcher arrête d'Invoke la fonction
Bonjour,
Je ne suis pas expert des dispatcher et du Threading. Du coup j'ai une question.
Je vais commencer par expliquer le contexte. Je récupère des données petit à petit par un script qui tourne en arrière plan (rempli un buffer). J'ai une fonction pour ajouter les données à différents graphiques. Cela se passe bien entre 20 et 100 fois (un nombre de fois très aléatoire). Après mon Dispatcher arrête de faire son job. Voici mon code:
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 40 41
|
public void UpdateDatas(TestResult result, List<Tuple<int, int>> modifiedRows)
{
if (GraphInformation.Selection.XAxisData == null || result == null)
{
CreateGraphLinesCollection();
return;
}
Dispatcher.InvokeAsync(new Action(() =>
{
var selection = GraphInformation.Selection;
XAxisLabel = selection.XAxisData.ChannelMetadata.DisplayName + GetFormattedUnitOfMeasure(selection.XAxisData.ChannelMetadata);
Y1AxisLabel = GetYAxisLabel(selection.Y1AxisDataCollection);
Y2AxisLabel = GetYAxisLabel(selection.Y2AxisDataCollection);
try
{
lock (_graphLinesLock)
{
foreach (var yData in selection.Y1AxisDataCollection)
AddGraphLine(Axis.AxisY1, selection.XAxisData, yData, result, modifiedRows);
foreach (var yData in selection.Y2AxisDataCollection)
AddGraphLine(Axis.AxisY2, selection.XAxisData, yData, result, modifiedRows);
RemoveExtraLines();
}
}
finally{
lock (_graphLinesLock)
{
DoPropertyChanged(() => GraphLines);
InitializeMinAndMax();
UpdateAxesVisibilities();
}
}
}));
} |
Si je mets un breakpoint à la ligne Dispatcher.InvokeAsync, on y passe toujours même quand les data ne sont pas ajoutées à mes graphs.... mais on ne passe plus dans l'action. Ce qui est très embetant.
Ce que j'ai essayé:
- Utiliser un BeginInvoke, pas de changement
- Ajouter un .Wait(newTimeSpan(2000)) après le InvokeAsync(). Pas de changement.
- J'ai tenté de faire un timer pour créer un timeout, sans succès.
- Shutdown le dispatcher chaque 20 passage. Il n'ajoutera plus les données.
Voici aussi quelques liens sur les quelles je me suis penchés; https://stackoverflow.com/questions/...invoke-hanging, https://learn.microsoft.com/en-us/do...owsdesktop-7.0, https://stackoverflow.com/questions/...-my-dispatcher, https://learn.microsoft.com/en-us/do...owsdesktop-7.0
Peut-être que j'ai mal compris ce que j'ai lu. En espérant que quelqu'un a une piste ou peut m'expliquer un peu mieux comment fonctionne ses dispatcher.
Merci beaucoup et n'hésitez pas à me poser des question ;)