BackgroundWorker en execution : 2 au max ?

Résolu
nihonsx5 Messages postés 20 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 16 février 2014 - 2 juin 2007 à 18:59
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 - 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

2 réponses

nihonsx5 Messages postés 20 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 16 février 2014
3 juin 2007 à 16:25
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...
3
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
3 juin 2007 à 22:08
Dans ce cas accepte ta 2ème réponse, faut respecter le règlement !

Redman
0
Rejoignez-nous