2010-02-19 83 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