2010-02-19 21 views
13

Dosya aktarımı yapan C# içinde bir sunucu ve istemci oluşturdum. Ama aktarırken, bir kaç saniyeliğine durur ve devam eder. Göstermek için YouTube'da bir video yükledim: http://www.youtube.com/watch?v=GGRKRW6ihLoAğ aktarımı duraklatılıyor

Gördüğünüz gibi bir süre duraklar ve devam eder.

Alıcı:

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

Gönderen:

  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 video için :-) –

+0

biraz daha fazla bilgi güzel olurdu, bu bir tcp bağlantısı mı yoksa udp mi? Dosyayı bağlantı üzerinden gönderir mi yoksa orada bazı protokol var mı? Videoda duraklama göremedim, ne oldu? Duraklatıldığında devreye giren GC olabilir mi? Arayüz asar mı yoksa sadece veriyi yazan thread mı? Aktarımın% 'sine eriştiğinizde bu iş parçacığı güvenli mi? – Peter

+0

TcpClient ve TcpListener. Protokolüm var. Örneğin% 6,2 ve% 24,03 oranında duraklar. Arayüz asılmıyor. Eşzamanlı dosya aktarımlarını destekler, böylece aynı anda iki dosya aktarımı yapabilir ve aktarımlar aynı anda duraklamaz. Evet, bu iş parçacığı güvenli inanıyorum, çünkü bu işlevselliği eklemeden önce oldu. – ErikTJ

cevap

1

deneyin

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

ayarı

var buffer = new byte[ tcpClient.SendBufferSize ]; 

Oku

var buffer = new byte[ tcpClient.ReceiveBufferSize ]; 

TcpClient.SendBufferSize ve TcpClient.ReceiveBufferSize platformuna bağlı olarak değişebilir gönder. Bazı durumlarda tamponun yarı büyüklüğünü veya TcpClient Buffer boyutunun iki katı büyüklüğünde olmasını sağladım.

+0

Bunun bir gelişme olduğunu düşünüyorum, ama emin değilim. Duraklamalar çok rasgele, bu yüzden söylemek zor. – ErikTJ

1

Güzel bir video .... Ya _bufferSize olarak ayarlanır? Boyutu düşürün ve davranışı değiştirip değiştirmediğini görün. Boyutları yarıya böldüğüm zaman transferlerim daha az topaklıydı. İyi eğlenceler!

+0

Bence bu Famdam ile birleşince çözdü. – ErikTJ

İlgili konular