2010-02-19 43 views
13

Tôi đã tạo một máy chủ và một máy khách trong C# để chuyển các tập tin. Nhưng khi chuyển nó tạm dừng trong vài giây và sau đó tiếp tục. Tôi đã tải lên một video trên YouTube để chứng minh: http://www.youtube.com/watch?v=GGRKRW6ihLoChuyển mạng tạm dừng

Như bạn có thể thấy, đôi khi tạm dừng và sau đó tiếp tục.

Receiver:

 using (var writer = new StreamWriter(Path.Combine(_localPath, file.FileName))) { 
      var buffer = new byte[_bufferSize]; 
      while (file.Transferred < file.Size && _active) { 
       int read = ns.Read(buffer, 0, _bufferSize); 
       writer.BaseStream.Write(buffer, 0, read); 
       file.Transferred += read; 
      } 
      writer.Close(); 
     } 

Tên người gửi:

  using (var reader = new StreamReader(file.FilePath)) { 
       var buffer = new byte[_bufferSize]; 
       while (file.Transferred < file.Size && _active) { 
        int read = reader.BaseStream.Read(buffer, 0, _bufferSize); 
        ns.Write(buffer, 0, read); 
        file.Transferred += read; 
       } 
       reader.Close(); 
      } 
+7

+1 cho video :-) –

+0

thông tin thêm một chút sẽ tốt đẹp là kết nối tcp hoặc udp? hiện nó chỉ gửi các tập tin thô trên kết nối hoặc là có một số giao thức ở đó? tôi không thấy tạm dừng trong video bù đắp gì? nó có thể là GC mà đá trong khi nó tạm dừng? Giao diện có treo hay chỉ luồng chỉ ghi dữ liệu? khi bạn truy cập% của quá trình chuyển là luồng an toàn được thực hiện này? – Peter

+0

TcpClient và TcpListener. Tôi có một giao thức. Nó tạm dừng ở mức 6,2% và 24,03% chẳng hạn. Giao diện không treo. Nó hỗ trợ chuyển tập tin đồng thời, vì vậy tôi có thể có hai tập tin chuyển giao cùng một lúc và chuyển giao không tạm dừng cùng một lúc. Vâng, đó là chủ đề an toàn tôi tin, bởi vì điều này xảy ra trước khi tôi thêm chức năng đó. – ErikTJ

Trả lời

1

Hãy thử thiết

// Sends data immediately upon calling NetworkStream.Write. 
tcpClient.NoDelay = true; 

Gửi

var buffer = new byte[ tcpClient.SendBufferSize ]; 

đọc

var buffer = new byte[ tcpClient.ReceiveBufferSize ]; 

Các TcpClient.SendBufferSize và TcpClient.ReceiveBufferSize có thể khác nhau tùy thuộc vào nền tảng. Tôi có trong một số trường hợp làm cho bộ đệm một nửa kích thước hoặc gấp đôi kích thước - của kích thước bộ đệm TcpClient.

+0

Tôi nghĩ rằng điều này đã cải thiện, nhưng tôi không chắc chắn. Việc tạm dừng rất ngẫu nhiên nên khó mà nói được. – ErikTJ

1

đẹp phim .... Những gì được _bufferSize bạn thiết lập để? Thả kích thước xuống và xem nó có thay đổi hành vi không. Việc chuyển tiền của tôi ít gắt hơn khi tôi cắt kích thước thành một nửa. Chúc vui vẻ!

+0

Tôi nghĩ điều này kết hợp với Famdam đã giải quyết nó. – ErikTJ