Bonsoir,

J'ai créé une application qui télécharge sur plusieurs threads/sockets et qui écrit a la fois dans un fichier.

Pour l'instant voici ce que je fais :

Tout ce qui suit est dans un backgroundworker et les index etc.. sont géré par une bdd sqlce

Téléchargement asynchrone avec BeginReceive

à chaque fois que ma callback est appelée j' "Invoke" un délégué qui va écrire ce qui a été téléchargé, donc ~BUFFER_SIZE dans un fichier, pour l'instant mon BUFFER_SIZE est de 3500 octets.

Ca veut dire que a chaque fois qu'un paquet est reçu je lui intime l'ordre d'écrire directement mes 3500 octet dans un fichier.

[mode j'aime bien emmètre des doutes sur des choses évidentes]
Je pense qu'il faut que je limite un maximum mon nombre de traitement dans mon callBack déjà, pensez vous que l'appel à Invoke surchage ma callback ? a priori non ?
[/eoj]

Est-ce que je ne devrais pas plutôt créer mon propre buffer qui ferait par exemple 10Mo et attendre que celui ci soit rempli pour lancer l'écriture du fichier ?

Le soucis si je fais ca c'est que je risque d'utiliser beaucoup de ram, et si je met par exemple un block_size de 10Mo, ca peut faire super lourd si je met 10 threads par exemple

Enfin voilà c'est pas évident d'arriver à optimiser

J'aurais voulu savoir également pourquoi lorsque je me fais par exemple un tableau de byte de taille 4000 octet, et que je lui dit de me télécharger 4000 octet à l'appel de beginreceive mon tableau est trop petit ?

Quelques bout de mon code :

Callback de téléchargement :
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
    Public Sub callB(ByVal ar As IAsyncResult)
        Dim current As DBChunk = CType(ar.AsyncState, DBChunk)
        Dim read As Integer = _socket.EndReceive(ar)
        If (read = 0) Then
            _socket.Close()
        Else
            Dim index As Integer = 0
            If (current.current_byte = current.start_byte) Then
                Dim s As String = Encoding.ASCII.GetString(_buffer, 0, read)
                If (s.Contains("HTTP/")) Then
                    index += s.IndexOf(vbCrLf & vbCrLf) + 4
                Else
                    MsgBox("ERREUR, pas de GET dans le paquet c'est CHELOU")
                End If
            End If
 
            Dim de As New DataDownloadEvent(_buffer, read - index)
            de.CurrentFirstWriteIndex = index
 
            Dim r As New received(AddressOf _form.dlm._dm.worker2)
            de.CurrentChunk = current
            _form.Invoke(r, New Object() {Me, de})
            current.current_byte += read - index
            _socket.BeginReceive(_buffer, 0, READ_SIZE, SocketFlags.None, AddressOf callB, current)
        End If
    End Sub
Ecriture du fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
    Public Sub worker2(ByVal sender As Object, ByVal e As DataDownloadEvent)
        fs.Seek(e.CurrentChunk.current_byte, SeekOrigin.Begin) 
        fs.Write(e.Received, e.CurrentFirstWriteIndex, e.ByteReceived)
        fs.Flush()
        RaiseEvent DataReceived(Me, New DataDownloadEvent(e.ByteReceived))
    End Sub
Je suis ouvert à toute remarque