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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } } })); }
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
Partager