Frage Lesen von Stream zu einem MemoryStream in mehreren Threads


Ich stecke an einem Ort fest. Ich lese eine FLV-Datei von einer URL. Ich lese dies in einem 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 dann dieses ByteArray in eine lokale Datei auf meiner Festplatte.

Da dieses flv zu groß ist, benötigt es viel Zeit, um in der Schleife zu arbeiten. Ich denke daran, den ursprünglichen großen Stream in MemoryStream in mehreren Threads zu lesen. Das bedeutet, den Stream in etwa 10 Teile zu teilen und diese Teile in mehreren Threads in MemoryStream zu schreiben. Wie mache ich das?

Ich befestige meinen Code.

//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();
                    }  


                }

Jede Hilfe wird geschätzt Vielen Dank


5
2018-02-05 14:20


Ursprung


Antworten:


Sie können den Download nicht beschleunigen, indem Sie mehrere Threads verwenden. Der begrenzende Faktor hier ist 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 ein erstellen WebClient eher, als WebRequest. Sie können dann anrufen WebClient.DownloadDataAsync um Daten in den Speicher im Hintergrund zu laden oder anzurufen WebClient.DownloadFileAsync direkt in eine Datei herunterladen.

Keine davon wird den Download beschleunigen, aber sie werden verhindern, dass Ihre Benutzeroberfläche während des Downloads nicht reagiert.


2
2018-02-05 14:34



Threads werden dir hier nicht helfen; Sie werden auf IO blockiert werden. Anstatt 1 Thread auf IO blockiert zu haben, werden nun mehrere Threads für IO blockiert. In der Tat wird in vielen Fällen mit derselben Ressource (oder parallelen aber verwandten Ressourcen) auf mehreren Threads gesprochen verringern E / A-Durchsatz plus Threading-Overhead. Verlieren verlieren.

Auch - die meisten Streams sind nicht entworfen zum Einfädeln; Sie würden einen sehr komplexen Koordinationscode benötigen, um sicherzustellen, dass Sie den Stream in der richtigen Reihenfolge wieder zusammensetzen und den internen Zustand nicht durcheinander bringen. ehrlich gesagt, es ist es nicht wert.


1
2018-02-05 14:35