Bonjour,

J'ai plusieurs Tasks que je lance les unes à la suite des autres.
Pour chaque Task, j'utilise TaskContinuationOptions.OnlyOnFaulted (lorsqu'une exception est lancée à l'interrieur de ma Task mère) et TaskContinuationOptions.OnlyOnRanToCompletion lorsque tout se passe bien.

Cependant, il suffit qu'une seule tâche soit en "Faulted" pour que toutes les autres executent le code OnlyOnFaulted, alors qu'elles n'ont pas toutes jeté d'exception.

Merci pour votre aide

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
48
49
50
51
52
53
54
 
                //List of Tasks
                List<Task<object>> lstTasks = new List<Task<object>>();
 
                // Will start to search on selected promary Sites
                foreach (SCCMSite site in lbSccmSites.SelectedItems)
                {
 
                    SCCMSite tmpSite = site;
 
                    Task<object> tsk = new Task<object>(() =>
                     {
                         PageExecutionJob.JbList.AddJob(tmpSite.Name, "Connection to WMI Database");
 
                         //Search for the Advertisement Name (have to select the site name in the query to retreive only advertisements belonging to this site)
                         Dictionary<string, string> dCriteria = new Dictionary<string, string>();
                         dCriteria.Add("%" + sAdvSearched + "%", SCCMField.ATTRIBUT_NAME_ADVERTISEMENT_NAME);
                         dCriteria.Add(tmpSite.Name, SCCMField.ATTRIBUT_NAME_ADVERTISEMENT_SOURCE_SITE);
 
                         List<SCCMAdvertisement> lAdvFoundOnSite = new List<SCCMAdvertisement>();
 
						 //EXCEPTION CAN HAPPEN HERE.
                             lAdvFoundOnSite = SCCMAdvertisement.GetAdvertisementByPropertyLike(dCriteria, site);
                             lAdvFound.AddRange(lAdvFoundOnSite);
 
                             //Pass the result information retreived for the bwLastGenerated.RunWorkerCompleted event
                             List<object> lstResult = new List<object>();
                             lstResult.Add(tmpSite.Name);
                             lstResult.Add(lAdvFoundOnSite.Count);
                             lstResult.Add(Job.JobStatusValue.DoneSuccessfully);
                             lstResult.Add(lAdvFoundOnSite);
 
                             return lstResult;
 
                     });
                    tsk.ContinueWith((t) =>
                    {
                        if (t.Status == TaskStatus.RanToCompletion)
                        {
                            List<object> lstResult = t.Result as List<object>;
 
                            PageExecutionJob.JbList.UpdateJob(lstResult[0].ToString(), lstResult[1] + " Advertisement(s) found on " + lstResult[0], (Job.JobStatusValue)lstResult[2]);
                            dgSCCM.BindSCCMAdvertisements((List<SCCMAdvertisement>)lstResult[3]);
                        }
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
                    tsk.ContinueWith((t) =>
                    {
                        PageExecutionJob.JbList.UpdateJob(tmpSite.Name, " Error retreiving Advertisement(s) : " + t.Exception.Message, Job.JobStatusValue.DoneError);
                    }, TaskContinuationOptions.OnlyOnFaulted);
 
                   lstTasks.Add(tsk);
                   tsk.Start();
 
                }