2011-02-05 45 views
5

Tôi bị kẹt ở một nơi. Tôi đang đọc một tập tin flv từ một URL. Tôi đang đọc này vào một Stream và sau đó viết Stream này vào MemoryStream trong một vòng lặp. Khi mã đi ra khỏi vòng lặp, tôi đang viết toàn bộ MemoryStream đến một ByteArray và sau đó viết ByteArray này vào một tệp cục bộ trên đĩa cứng của tôi.Đọc Luồng tới một MemoryStream trong nhiều chủ đề

Vì flv này quá lớn nên phải mất rất nhiều thời gian để xử lý trong vòng lặp. Tôi đang nghĩ đến việc đọc luồng lớn ban đầu trong MemoryStream trong nhiều luồng. Điều đó có nghĩa là chia luồng trong 10 phần và viết những phần này vào MemoryStream trong nhiều chủ đề. Làm thế nào để tôi làm điều này?

Tôi đang đính kèm đoạn mã của mình.

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


       } 

Any help is appreciated Cảm ơn

+1

Tại sao bạn nghĩ rằng nhiều chuỗi sẽ giúp bạn ở đây? –

+0

Nếu tôi có thể đọc luồng lớn đó vào bộ nhớ trong chuỗi, tôi thực sự có thể tăng tốc quá trình. –

+0

Nút cổ chai trong trường hợp này là thời gian cần thiết để đến qua mạng và không phải mất thời gian để đọc và di chuyển nó trong bộ nhớ. –

Trả lời

2

Bạn sẽ không thể để tăng tốc độ tải về bằng cách sử dụng nhiều chủ đề. Các yếu tố hạn chế ở đây không phải là cách nhanh chóng máy tính của bạn có thể xử lý dữ liệu, mà là tốc độ dữ liệu đến từ máy chủ.

Thay vì cố gắng tăng tốc độ này bằng nhiều chủ đề, tôi khuyên bạn nên tạo một WebClient thay vì WebRequest. Sau đó, bạn có thể gọi WebClient.DownloadDataAsync để tải dữ liệu xuống bộ nhớ trong nền hoặc gọi WebClient.DownloadFileAsync để tải trực tiếp xuống tệp.

Không một trong số đó sẽ tải xuống nhanh hơn, nhưng chúng sẽ ngăn giao diện người dùng của bạn không phản hồi trong quá trình tải xuống.

+0

Nhưng sau đó tải xuống đa tác phẩm hoạt động như thế nào? –

+1

Tải xuống nhiều phân đoạn tận dụng lợi thế của các yêu cầu GET trong phạm vi HTTP. Nó làm cho nhiều yêu cầu đồng thời (đến cùng một máy chủ, hoặc với các máy nhân bản). Có nhiều luồng đang chạy, mỗi luồng tải xuống các phần khác nhau của tệp. Ngoài ra, có một nhiệm vụ quản lý của một số loại kiểm soát các chủ đề riêng biệt và xử lý đặt các phần riêng biệt của tập tin với nhau một khi tất cả các phân đoạn được tải xuống. Xem http://www.codeproject.com/KB/IP/MyDownloader.aspx để biết ví dụ. –

1

Chủ đề sẽ không giúp bạn ở đây; bạn sẽ bị chặn trên IO. Thay vì 1 thread bị chặn trên IO, bây giờ bạn sẽ có nhiều luồng bị chặn trên IO. Trong thực tế, trong nhiều trường hợp, việc nói chuyện với cùng một tài nguyên (hoặc song song nhưng các tài nguyên có liên quan) trên nhiều luồng sẽ giảm thông số IO IO, cộng với chi phí luồng luồng. Thua: thua.

Ngoài ra - hầu hết các luồng là không được thiết kế cho luồng; bạn sẽ cần một số mã phối hợp rất phức tạp để đảm bảo bạn tập hợp lại luồng theo thứ tự đúng và không làm hỏng trạng thái bên trong; thẳng thắn, nó không phải là giá trị nó.

Các vấn đề liên quan