6 Stimmen

Lesen eines Stream in einen MemoryStream in mehreren Threads

Ich sitze an einem Ort fest. Ich lese eine flv-Datei von einer URL. Ich lese diese in einen Stream und schreibe diesen Stream dann in einer Schleife in einen MemoryStream. Wenn der Code aus der Schleife kommt, schreibe ich den gesamten MemoryStream in ein ByteArray und schreibe dieses ByteArray dann in eine lokale Datei auf meiner Festplatte.

Da diese flv-Datei zu groß ist, braucht sie viel Zeit, um in der Schleife verarbeitet zu werden. Ich denke daran, den ursprünglichen großen Stream in MemoryStream in mehreren Threads zu lesen. Das heißt, ich teile den Stream in sagen wir 10 Teile und schreibe diese Teile in mehreren Threads in MemoryStream. Wie kann ich dies tun?

Ich füge mein Stück Code bei.

//Get a data stream from the url
                WebRequest req = WebRequest.Create(url);
                WebResponse response = req.GetResponse();
                using (Stream stream = response.GetResponseStream())
                {
                    //Download in chuncks
                    byte[] buffer = new byte[1024];

                    //Get Total Size
                    int dataLength = (int)response.ContentLength;

                    //Download to memory
                    //Note: adjust the streams here to download directly to the hard drive
                    using (MemoryStream memStream = new MemoryStream())
                    {
                        while (true)
                        {
                            //Try to read the data
                            int bytesRead = stream.Read(buffer, 0, buffer.Length);

                            if (bytesRead == 0)
                            {
                                Application.DoEvents();
                                break;
                            }
                            else
                            {
                                //Write the downloaded data
                                memStream.Write(buffer, 0, bytesRead);
                            }
                        }

                        //Convert the downloaded stream to a byte array
                        byte[] downloadedData = memStream.ToArray();
                    }  

                }

Für jede Hilfe sind wir dankbar Danke

2voto

Jim Mischel Punkte 125706

Durch die Verwendung mehrerer Threads können Sie den Download nicht beschleunigen. Der begrenzende Faktor ist hier nicht, wie schnell Ihr Computer die Daten verarbeiten kann, sondern wie schnell die Daten vom Server kommen.

Anstatt zu versuchen, dies mit mehreren Threads zu beschleunigen, würde ich vorschlagen, dass Sie eine WebClient statt WebRequest . Sie können dann aufrufen WebClient.DownloadDataAsync um Daten im Hintergrund in den Speicher zu laden, oder rufen Sie WebClient.DownloadFileAsync um direkt in eine Datei herunterzuladen.

Beides macht den Download nicht schneller, verhindert aber, dass die Benutzeroberfläche während des Downloads nicht reagiert.

1voto

Marc Gravell Punkte 970173

Threads werden Ihnen hier nicht helfen; Sie werden auf IO blockiert werden. Anstatt eines Threads, der für IO blockiert ist, werden Sie nun mehrere Threads haben, die für IO blockiert sind. In vielen Fällen wird die Kommunikation mit derselben Ressource (oder parallelen, aber verwandten Ressourcen) in mehreren Threads verringern IO-Durchsatz, zuzüglich des Threading-Overheads. Verlieren : verlieren.

Außerdem sind die meisten Ströme nicht entworfen für Threading; man bräuchte einen sehr komplexen Koordinationscode, um sicherzustellen, dass man den Stream in der richtigen Reihenfolge wieder zusammensetzt und den internen Zustand nicht durcheinanderbringt; offen gesagt, ist es das nicht wert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X