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 :

BackgroundWorker, question de débutant


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    retraite
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraite

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 20
    Points
    20
    Par défaut BackgroundWorker, question de débutant
    Bonjour

    Ma question va sembler idiote mais j aimerais savoir si une methode appelée depuis un BackgroundWorker est interrompue quand le BackgroundWorker l'est.

    J ai opté pour cette solution (BackgroundWorker ) bien plus simple pour moi que les threads à proprement parler pour lire un gros fichier texte.

    Le pb est que si la lecture du fichier s'arrête alors qu il est toujours ouvert dans la procédure, selon moi, mais comme je débute j ai tout un tas d'à priori, mon fichier ne sera plus accessible.
    D'où mon interrogation.

    merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 897
    Points : 1 913
    Points
    1 913
    Par défaut
    Bonjour,

    Je vais d'abord d'abord répondre sur le BackgroundWorker. Je ne suis pas sûr de ce que tu appelles interrompre le BackgroundWorker mais je vais partir du principe qu'il s'agit d'un appel à CancelAsync. Je pense qu'en soit ça n'a pas d'effet sur la fonction enregistrée comme handler sur l'événement DoWork, c'est à toi de le gérer. Pour cela il faut récupérer le sender passé en paramètre et le caster en BackgroundWorker, puis vérifier périodiquement la propriété CancellationPending, par exemple à chaque ligne d'un fichier traité ou à chaque enregistrement d'une requête sur une base de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void ProcessFile(object sender, DoWorkEventArgs e)
    {
      var bw = (BackgroundWorker)sender;
      var filepath = (string)e.Argument
      var lines = File.ReadAllLines(filepath);
      var result = new List<Result>();
      foreach(var line in lines)
      {
        if(bw.CancellationPending) return;
        result.Add(ProcessLine(line));
      }
      e.Result = result;
    }
    La fermeture du fichier devrait se produire à un moment ou un autre car les flux de fichier (FileStream) sont des IDisposable et leur méthode Dispose sera appelée à un moment donné par le Garbage Collector. Pour en assurer une fermeture déterministe il faudra instancier le flux soi-même et utiliser les gardes using. Dans le code ci-dessus le fichier devrait être fermé à la fin de File.ReadAllLines.

    Une autre option pour gérer l'asynchrone est de passer par les Task et les mots clé async/await.

    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
    public static async Task<Result[]> ProcessFile(string filepath, CancellationToken token)
    {
      var lines = await File.ReadAllLinesAsync(filepath, token);
      var result = await ProcessLinesAsync(token);
      return result;
    }
     
    public static Task<Result[]> ProcessLinesAsync(string[] lines, CancellationToken token) =>
      Task.Run(() =>
      {
        var result = new List<Result>();
        foreach(var line in lines)
        {
          token.ThrowIfCancellationRequested();
          lines.Add(ProcessLine(line));
        }
        return lines.ToArray();
      }, token);
    Pour tous les détails concernant les threads la référence francophone c'est les tutoriels de François Dorin sur le Pool de Thread.

  3. #3
    Membre à l'essai
    Homme Profil pro
    retraite
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraite

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 20
    Points
    20
    Par défaut
    Merci pour ces réponses claires contrairement à ma demande où je faisais effectivement référence à CancelAsync.

    Merci pour le lien en Français

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/06/2005, 10h56
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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