在多个线程中将Stream读取到MemoryStream

sum*_*mer 5 c# multithreading memorystream bytearray stream

我被困在一个地方.我正在从URL读取flv文件.我正在将其读取到Stream,然后将此Stream写入循环中的MemoryStream.当代码从循环中出来时,我将整个MemoryStream写入ByteArray,然后将此ByteArray写入硬盘上的本地文件.

由于此flv太大,因此在循环中处理需要花费大量时间.我正在考虑在多个线程中读取MemoryStream中的原始大流.这意味着将Stream分成10个部分,并将这些部分写入多个线程中的MemoryStream.我该怎么做呢?

我附上了我的代码.

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


                }
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏谢谢

Jim*_*hel 2

您将无法通过使用多线程来加快下载速度。这里的限制因素不是计算机处理数据的速度,而是数据来自服务器的速度。

我建议您创建一个 WebClient而不是WebRequest. 然后可以调用WebClient.DownloadDataAsync在后台将数据下载到内存中,或者调用WebClient.DownloadFileAsync直接下载到文件。

这些方法都不会使下载速度更快,但它们会阻止您的用户界面在下载过程中无响应。