2016-03-21 28 views
2

Merhaba Bir kaynaktan çok ağ hedeflerine çok sayıda dosyayı kopyalamak için multithread kullanıyorum, her bir iş parçacığı bir dosya yığını Farklı ağa kopyalayın! ben,% 100 tek bir ağ üzerinde kullanan her anC# File.Copy birden çok Ağ hedef bloğu diğer konuları

enter image description here

ağdan ağa 100% değişim bkz .net File.Copy (...) kullanın.

  1. Ben, o zaman ben dengeli bayt yerine 10 dişin 10 süreçlerini (farklı hedefe her biri) çalıştırmayı denedi tüm dişler

  2. üzerinden kopyalama bkz yerel birine hedefleri değiştirmeye çalıştı sonra tüm 10 ağını% 100 kullanıyorum.

.net 4.5 herhangi bir fikrim var mı?

+1

Herhangi bir kod sağlayabilir misiniz? – icbytes

+0

gerçekten sadece File.Copy, hedef ağ bir (\\ 10.161.1.1 \ ...) – user5287071

+1

Kesinlikle ürperti olarak buggy kodlama varmış gibi görünüyor. Başlarda bahsettiğiniz gibi, 100 kullanım sadece başına Bir seferde bir ağ. – icbytes

cevap

-1

Asenkronize işlemlere göz attınız mı? Özellikle async IO hakkında MSDN hakkında gerçekten iyi belgeler var. gibi yığın taşmasıyla ilgili async IO hakkında bazı sorular da vardır.

Task.Run'u kullanarak tüm dosya kopyalama işlemlerinizi senkronize olmayan bir şekilde sıralayabilirsiniz.

List<String> fileList = new List<string>(); 
    fileList.Add("TextFile1.txt"); 
    fileList.Add("TextFile2.txt"); 

    Parallel.For(0, fileList.Count, x => 
    { 
     File.Copy(fileList[x], @"C:\" + fileList[x]); 
    } 
    ); 

Değişim c:

+0

downvoter downvote nedenlerini açıklamak için bakım yapabilir mi? – Louis

-1

gibi bir şey deneyin \ sizin birden çok hedef eşleşecek. Orignal kodunu verirseniz daha fazlasını yapabiliriz.

0

IO bağlı işlemler için mükemmel performans gösteren async/await modeliyle iş parçacığı (CPU bağlı işlemler için iyi) değiştirmenizi öneririm.

public static async Task Copy(string src, string dest) 
{ 
    await Task.Run(() => { 
     System.IO.File.Copy(src, dest); 
    }); 
} 

Aşağıda pasajı olarak yöntemini çağırarak onu aramak gibi en File.Copy operasyonu yeniden yazılmalı.

var srcPath = "your source location"; 
var dstPath = "your destination location"; 

foreach(var file in System.IO.Directory.EnumerateFiles(srcPath)) 
{ 
    var dstFile = System.IO.Path.Combine(dstPath, System.IO.Path.GetFileName (file)); 
    Copy (file, dstFile); 
} 

Artık sadece olabildiğince hızlı olarak src ve hedef yolları ile bu yöntemi pompa olabilir. Sınırlılığınız IO hız (disk/ağ vb.) Olacaktır, ancak Cpu'nuz çoğunlukla ücretsiz olacaktır.