BackgroundWorker en execution : 2 au max ? [Résolu]

nihonsx5 20 Messages postés samedi 21 décembre 2002Date d'inscription 16 février 2014 Dernière intervention - 2 juin 2007 à 18:59 - Dernière réponse : OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention
- 3 juin 2007 à 22:08
Bonjour,
je suis en train de faire un programme pour uploader des images sur des serveurs prévus à cet effet (Imagevenue etc...)
Mon problème est que je n'arrive pas à uploader plus de 2 images en même temps. J'ai essayé les threads que ce soit en
poolthread (avec un maxthreads à plus de 2), ou en delegate etc...
Je me suis alors dit que j'allais faire un test avec les backgroundworker. Pareil !! Je n'arrive pas à lancer 3 uploads en
même temps.
Pour l'envoi des images, ça fonctionne. Le problème, c'est l'envoi simultané de 3 images. Ce n'est pas le serveur qui en cause, mais bien mon programme.

Pour les essais avec les delegates et autres, j'avais bien 2 threads upload en "running" mais le 3ème était en "waitsleepjoin".
Je ne comprends pas pourquoi il est en attente, il aurait dû être aussi "running"...

Je vous mets l'exemple à la va vite que j'ai fait pour les backgroundworker.

Imports System.Threading
Imports System.Text
Imports System.IO
Imports System.Net

Public Class Form1

    ' Ce sont mes 3 images
    Dim filepath1 As String = "C:\test\A.jpg"
    Dim filepath2 As String = "C:\test\B.jpg"
    Dim filepath3 As String = "C:\test\C.jpg"

    '  mes 3 résultats
    Dim result1 As String = ""
    Dim result2 As String = ""
    Dim result3 As String = ""
   
    ' mon 1er thread pour envoyer la 1ère image
    Private Sub bgw1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw1.DoWork
        Dim boundary As String = ("----------" & DateTime.Now.Ticks.ToString("x"))
        Dim Postheader() As Byte

        Dim builder As New StringBuilder
        builder.Append("--")
        builder.Append(boundary)
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append("Content-Disposition: form-data; name=""imgcontent""")
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append("Not safe for work")
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append("--")
        builder.Append(boundary)
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append("Content-Disposition: form-data; name=""userfile[]""; filename=""")
        builder.Append(Path.GetFileName(filepath1))
        builder.Append("""")
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append("Content-Type: ")
        builder.Append("image/jpeg")
        builder.Append(ChrW(13) & ChrW(10))
        builder.Append(ChrW(13) & ChrW(10))
        Postheader = Encoding.UTF8.GetBytes(builder.ToString)

        Dim myStream As FileStream = Nothing
        Dim requestStream As Stream = Nothing
        Dim myResponse As HttpWebResponse = Nothing
        Dim myReader As StreamReader = Nothing

        Try
            Dim myRequest As HttpWebRequest = DirectCast(WebRequest.Create("http://www.imagevenue.com/upload.php"), HttpWebRequest)
            myRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6"
            myRequest.ContentType = ("multipart/form-data; boundary=" & boundary)
            myRequest.KeepAlive = False
            myRequest.ServicePoint.Expect100Continue = True
            myRequest.Method = "POST"
            myRequest.AllowWriteStreamBuffering = False
            Dim bytes As Byte() = Encoding.ASCII.GetBytes((ChrW(13) & ChrW(10) & "--" & boundary & "--" & ChrW(13) & ChrW(10)))

            myStream = New FileStream(filepath1, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

            Dim taille As Long = ((Postheader.Length + myStream.Length) + bytes.Length)
            myRequest.ContentLength = taille
            requestStream = myRequest.GetRequestStream

            ' On envoie les 1ères données
            requestStream.Write(Postheader, 0, Postheader.Length)

            Const BufferSize As Integer = 4096
            Dim content As Byte() = New Byte(BufferSize - 1) {}
            Dim dataRead As Integer
            Dim dataReads As Long = 0

            ' On envoie l'image
            While True
                dataRead = myStream.Read(content, 0, BufferSize)
                If dataRead = 0 Then
                    Exit While
                End If
                requestStream.Write(content, 0, dataRead)
                dataReads += dataRead
                bgw1.ReportProgress(Math.Round(CDbl((dataReads / myStream.Length) * 100), 0))
            End While

            ' On envoie les dernières données
            requestStream.Write(bytes, 0, bytes.Length)

            requestStream.Close()
            requestStream.Dispose()
            myStream.Close()
            myStream.Dispose()
            myResponse = DirectCast(myRequest.GetResponse, HttpWebResponse)
            myReader = New StreamReader(myResponse.GetResponseStream, Encoding.UTF8)
            Dim myResult As String = myReader.ReadToEnd
            myResponse.Close()
            myReader.Close()
            myReader.Dispose()

            If myResult.Contains("successfully") Then
                If (myResult.Contains("[http://") AndAlso myResult.Contains("[/URL ")) Then
                    myResult = myResult.Substring(myResult.IndexOf("[URL=http://"))
                    myResult = myResult.Remove((myResult.IndexOf("]", 0) + 6))
                ElseIf (myResult.Contains("")) Then
                    myResult = myResult.Substring(myResult.IndexOf("", 0) + 6))
                End If

                result1 = myResult
            End If

        Catch exception As Exception

        Finally
            Try
                If (Not requestStream Is Nothing) Then
                    requestStream.Close()
                    requestStream.Dispose()
                End If
                If (Not myStream Is Nothing) Then
                    myStream.Close()
                    myStream.Dispose()
                End If
                If (Not myResponse Is Nothing) Then
                    myResponse.Close()
                    myResponse = Nothing
                End If
                If (Not myReader Is Nothing) Then
                    myReader.Close()
                    myReader.Dispose()
                End If

            Catch 'obj2 As Object
            End Try
        End Try
      
    End Sub

Private Sub bgw2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw2.DoWork
       
' C'est la même chose que pour le 1er backgroundworker sauf que l'on utilse la 2ème image

    End Sub

    Private Sub bgw3_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw3.DoWork
         
' C'est la même chose que pour le 1er backgroundworker sauf que l'on utilse la 3ème image

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' On lance les 3 backgroundworker      

        bgw1.RunWorkerAsync()
        bgw2.RunWorkerAsync()
        bgw3.RunWorkerAsync()
    End Sub

    ' Pour afficher la progression
    Private Sub bgw1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub bgw2_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw2.ProgressChanged
        ProgressBar2.Value = e.ProgressPercentage
    End Sub

    Private Sub bgw3_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw3.ProgressChanged
        ProgressBar3.Value = e.ProgressPercentage
    End Sub

End Class

Un peu d'aide serait la bienvenue.
A bientôt
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
nihonsx5 20 Messages postés samedi 21 décembre 2002Date d'inscription 16 février 2014 Dernière intervention - 3 juin 2007 à 16:25
3
Merci
bonjour,
en fait j'avais tout faux. Je suis limité à 2 connections max par le serveur.

J'ai essayé un logiciel qui fait la même chose (upload d'images sur serveur). Je pensais qu'il faisait vraiment
+ de 2 connections en même temps, car on pouvait modifier le nombre de threads.
J'ai regardé les ports ouverts, et il n'y en a que 2 d'ouverts à chaque fois.

Désolé pour  le dérangement...

Merci nihonsx5 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de nihonsx5
OneHacker 1466 Messages postés jeudi 2 novembre 2000Date d'inscription 23 septembre 2007 Dernière intervention - 3 juin 2007 à 22:08
0
Merci
Dans ce cas accepte ta 2ème réponse, faut respecter le règlement !

Redman
Commenter la réponse de OneHacker

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.