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

VB.NET Discussion :

Arrêter un backgroundworker


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2012
    Messages : 75
    Par défaut Arrêter un backgroundworker
    Bonjour, j'ai un backgroundworker qui upload des fichiers (images/mp3/exe) sur un ftp et je voudrais faire un bouton "Cancel upload" mais le problème est que j'ai testé de mettre ça dans le backgroundworker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BackgroundWorker1.WorkerSupportsCancellation = True
            If BackgroundWorker1.CancellationPending Then
                e.Cancel = True
                HuraProgressBar1.Value = 0
                Label3.text = "0%"
            End If
    Et ça dans le bouton "Cancel upload" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If BackgroundWorker1.IsBusy Then
     
                  If BackgroundWorker1.WorkerSupportsCancellation Then                
                     BackgroundWorker1.CancelAsync()
                  End If
              End If
    Mais ça ne marche pas donc je me suis demandé si on pouvait cancel un webrequest en plein milieu et je ne sais pas comment m'y prendre, voila mon code :
    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
    Dim request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri(fichftp & filename)), FtpWebRequest)
                    request.Method = WebRequestMethods.Ftp.UploadFile
                    request.Credentials = New NetworkCredential(user, pass)
                    request.UseBinary = True
                    request.UsePassive = False
                    Dim fileStream() As Byte = System.IO.File.ReadAllBytes(fichlocal)
                    Dim requestStream As System.IO.Stream = request.GetRequestStream()
                    For offset As Int64 = 0 To fileStream.Length Step 1024
                        BackgroundWorker1.ReportProgress(CType(offset * HuraProgressBar1.Maximum / fileStream.Length, Integer))
                        Dim chSize As Int64 = fileStream.Length - offset
                        If chSize > 1024 Then chSize = 1024
                        requestStream.Write(fileStream, offset, chSize)
                    Next
                    requestStream.Close()
                    requestStream.Dispose()
                    Label3.Text = "0%"
    Je ne suis pas là pour prendre votre solution en copier-coller et partir mais pour comprendre d'où le problème du "BackgroundWorker1.CancelAsync()" vient et/ou si on pouvait cancel directement la requête.
    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    la méthode cancelasync ne fait rien à part setter un booléen
    le backgroundworker n'est qu'une encapsulation, mais c'est à toi de coder ce qu'il faut derrière

    en l'occurrence une fois qu'on a dit de cancel, il faut depuis le bgw lire la propriété cancelpending (enfin de mémoire, c'est peut etre un autre nom) et s'il est à true c'est que tu as demandé le cancel
    un exit sub arrête alors ce que tu fais
    bien sur il convient de tenter d'arreter ce qu'on fait proprement, rien n'urge
    sur un stream dans une boucle pas de soucis particulier je pense

    après sur des instructions longues et unique cette solution ne fonctionne pas, le booléen est fait pour être vérifié souvent, donc idéalement dans une boucle
    mais vu que là tu as découpé au lieu de dire au framework de se débrouiller tout seul ca devrait aller
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre actif
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2012
    Messages : 75
    Par défaut
    J'ai tenté de rajouter le exit sub avec le cancellationPending mais cela n'a pas marché mais j'ai trouvé ceci sur un forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim workIsCompleted As Boolean = False
        While (Not BackgroundWorker1.CancellationPending) AndAlso (Not workIsCompleted)
     
            ' Do stuff here, but incrementally so that the while loop can
            ' periodically check to see if CancelAsync has been called.
            ' Also, be sure to set workIsCompleted = True when the work is done.
            ' Otherwise, you will just spin forever until someone cancels it
            ' (Which may or may not be a bad thing, depending on your requirements)
     
        End While
    J'ai donc tenté de mettre ma fonction d'upload dedans ainsi que de rajouter le "workiscompleted = true" a la fin mais je n'arrive pas a vérifier périodiquement si le CancelAsync a été appelé.
    Est-ce que ça voudrait dire que je dois vérifier le cancellationPending avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If BackgroundWorker1.CancellationPending = True Then
                    e.Cancel = True
                    HuraProgressBar1.Value = 0
                    Label3.Text = "0%"
                    Exit Sub
                End If
    Entre tout mes étapes d'upload ou directement dans ma boucle d'upload ?

Discussions similaires

  1. Arrêter un traitement BackGroundWorked
    Par bubulemaster dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/04/2008, 22h06
  2. Arrêter un BackgroundWorker
    Par vilcoy dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/07/2007, 13h35
  3. [DiVERS] -> Arrêter et redemarrer son programme ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/08/2003, 15h25
  4. Arrêter le PC
    Par Smortex dans le forum Assembleur
    Réponses: 5
    Dernier message: 31/12/2002, 10h48
  5. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

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