IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tasks et exception


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 192
    Par défaut Tasks et exception
    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();
     
                    }

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Tu es sûr que les autres n'ont pas lancé d'exception?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 192
    Par défaut
    Bonjour,

    Oui je suis sur. Mon lbSccmSites.SelectedItems Contient différents sites.
    Lorsque cette collection ne contient que des sites qui ne me généreront pas d'exception, le résultat est correct. Par résultat, j'entend l'affichage du résultat dans une datagrid, via la méthode PageExecutionJob.JbList.UpdateJob

    Cependant si cette liste contient au moins un site qui va me générer une exception, je me retrouve avec un mauvais résultat dans ma datagrid pour tous les autres sites.

    J' ai éssayé d'utiliser le CancellationToken, le
    try{
    Task.waitAll() (freeze mon UI)
    }
    catch(...)

    Je suis assez débutant et n'arrive pas à localiser le problème.

    Merci pour ton aide.

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Par défaut
    Salut,

    Première question : Pourquoi utilises-tu des Task ?

    SCCMSite tmpSite = site;
    Quel intérêt ?

    Il faudrait que tu nous exposes les sources de toutes tes méthodes. Notamment ton remplissage de la GRID.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Par défaut
    La gestion du multithreading et des appels asynchrones doit s'apprendre proprement et il faudrait bien plus que quelques lignes dans ce forum pour arriver à un niveau satisfaisant.

    Commence par cette introduction sur la programmation parallèle.

    Ensuite, utilise Postsharp pour gérer tes cas d'exception, comme dans cet exemple.

Discussions similaires

  1. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  2. Exception & Try..catch
    Par PurL dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/12/2002, 15h35
  3. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo