2010-02-19 85 views
13

我在C#中创建了一个服务器和一个客户端,用于传输文件。但是,传输它时会暂停几秒钟,然后继续。我已经上传到YouTube的视频演示:http://www.youtube.com/watch?v=GGRKRW6ihLo网络传输暂停

正如你可以看到它的某个时候暂停,然后继续。

接收机:

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

发件人:

  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的视频:-) – 2010-02-19 13:31:05

+0

更多的信息将是很好是一个TCP连接或UDP?它只是通过连接发送原始文件还是有一些协议?我在视频中没有看到什么偏移?它可能是暂停时插入的GC吗?接口是挂起还是只写数据的线程?当你访问传输的百分比是否完成线程安全? – Peter 2010-02-19 13:36:11

+0

TcpClient和TcpListener。我有一个协议。例如,它停留在6,2%和24,03%。界面不会挂起。它支持同时文件传输,所以我可以同时传输两个文件,传输不会同时暂停。是的,我相信这是线程安全的,因为这发生在我添加该功能之前。 – ErikTJ 2010-02-19 13:46:55

回答

1

尝试设置

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

发送

var buffer = new byte[ tcpClient.SendBufferSize ]; 

var buffer = new byte[ tcpClient.ReceiveBufferSize ]; 

的TcpClient.SendBufferSize和TcpClient.ReceiveBufferSize可以根据平台的不同而不同。在某些情况下,我已经将缓冲区的大小设置为TcpClient Buffer大小的一半或两倍。

+0

我认为这有所改善,但我不确定。暂停是如此随机,所以很难说。 – ErikTJ 2010-02-20 13:39:41

1

不错的视频....你是什么_bufferSize设置?降低尺寸,看看它是否改变了行为。当我把尺寸缩小一半时,我的转移不那么块。玩的开心!

+0

我认为这与Famdam结合解决了它。 – ErikTJ 2010-02-20 13:45:37