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

时间:2011-02-05 14:20:07

标签: c# multithreading stream bytearray memorystream

我被困在一个地方。我正在从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();
                    }  


                }

感谢任何帮助 谢谢

2 个答案:

答案 0 :(得分:2)

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

我建议您创建一个WebClient而不是WebRequest,而不是尝试使用多个线程加快速度。然后,您可以调用WebClient.DownloadDataAsync将数据下载到内存中,或者调用WebClient.DownloadFileAsync直接下载到文件中。

其中任何一个都不会使下载更快,但它们会阻止您的用户界面在下载过程中无响应。

答案 1 :(得分:1)

线程在这里不会帮助你;你将被阻止IO。而不是在IO上阻塞1个线程,您现在将在IO上阻止多个线程。事实上,在许多情况下,在多个线程上与相同的资源(或并行但相关的资源)进行通信将降低 IO吞吐量,加上线程开销。输了:输了。

此外 - 大多数流未设计用于线程化;你需要一些非常复杂的协调代码,以确保你按照正确的顺序重新组合流,不要搞乱内部状态;坦白说,这不值得。