Bonjour à tous,

J'ai un service Windows WCF qui propose un certains nombres de services et qui renvoie des callbacks aux utilisateurs connectés (DuplexChannelCallback).
J'ai configuré mon service en mode réentrant.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
 ConcurrencyMode = ConcurrencyMode.Reentrant
J'ai utilisé les locks pour protéger mes accès aux variables et pourtant j'ai l'impression que je suis face à un deadlock sur la méthode ci-dessous.
Ce qu'elle fait, elle supprime un élément dans la liste "listGTMSubProcessRegistered".
Ce qu'il faut savoir c'est que possiblement au même moment ou je supprime un élément, je peux passer dans une méthode "addSubProcess" qui de la même manière (lock, etc.) ajoute un élément dans la liste.
Dans le principe je pense faire juste ... Mais pourtant le lock semble me poser problème ... Qu'est ce que je fais de faux ?

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
42
43
44
45
46
47
 
 public void removeSubProcess(GTMSubProcess gtmSubProcess)
        {
            try
            {
                if (gtmSubProcess == null)
                    throw new Exception("Sous process non renseigné.");
 
                lock (_syncRoot)
                {
                    // -- Récupération des sous-process similaires pouvant éventuellement
                    // -- se lancer en même temps
                    // ------------------------------------------------------------
                    int iIndexSubProcessToRemove = GTMSubProcessCollection.indexOf(this.listGTMSubProcessRegistered,
                        gtmSubProcess.SIdInternalSchedulerSubProcess);
 
                    // -- Mise à jour du sous-process exécuté
                    // --------------------------------------
                    gtmSubProcess.GtmProcessInfo.State = GTMEnum.GTMAppState.WaitingStart;
                    gtmSubProcess.DtNextExecution = GTMSubProcessCollection.getDailyNextDate(gtmSubProcess.ListPeriodScheduler);
                    gtmSubProcess.LastElapsedTime = DateTime.Now.Subtract(gtmSubProcess.DtStartExecution);
 
                    // -- Selon l'emplacement du scheduler et le type de connexion
                    // -- Mise à jour de l'état du sous process
                    // ------------------------------------------------------------
                    GTMSubProcessDAO.Instance.updateSubProcess(gtmSubProcess);
 
                    // -- Suppression du sous-process
                    // ------------------------------
                    if (iIndexSubProcessToRemove > -1)
                    {
                        this.listGTMSubProcessRegistered.RemoveAt(iIndexSubProcessToRemove);
                        this.removeGUID(gtmSubProcess.SIdInternalSchedulerSubProcess);
                    }
                }
 
                // -- Appel de la méthode callback
                // -- sur les utilisateurs connectés
                // ---------------------------------
                foreach (ICallbackGTMScheduler ic in subscribers.ToList())
                    ic.subProcessStopped(gtmSubProcess);
            }
            catch (Exception ex)
            {
                adviseClientsAboutSchedulerException("GTMScheduler.removeSubProcess :" + ex.Message);
            }
        }