2016-11-10 53 views
2

我正在使用WinSCP .NET程序集上传文件。我想以异步的方式上传多个文件。我创建了一个方法,但它作为单一上传。C#WinSCP .NET程序集:如何异步上传多个文件

public class UploadingData { 

    private SessionOptions _sessionOptions; 
    private Session _session; 

    //connection etc 

    private void OnConnected() { 

     foreach (var fileInfo in localFilesList) 
     { 
      var task = Task.Factory.StartNew(() => UploadFilesAsync(fileInfo)); 
     } 
    } 

    private async Task UploadFilesAsync(string file) { 

     string remoteFilePath = _session.TranslateLocalPathToRemote(file, @"/", "/test_data_upload"); 
     var uploading = _session.PutFiles(file, remoteFilePath, false); 

     //When Done 

     await Task.Run(() => Thread.Sleep(1000)); 
    } 
} 

请给我正确的方法。由于

回答

1

可以使用的BackgroundWorker类是这样的:

 string[] images = new string[50]; 
     foreach (var path in images) 
     { 
      BackgroundWorker w = new BackgroundWorker(); 
      //50 independently async Threads 
      w.DoWork += delegate (object s, DoWorkEventArgs args) 
      { 
       Upload(args.Argument.ToString()); 
      }; 
      w.RunWorkerAsync(path); 
     } 
+0

如果需要我上传成千上万的文件,那么会有成千上万的后台工作人员。对应用程序和CPU来说是好的吗? –

+1

在一个应用程序中使用成千上万的磁盘并不好。因此,您的应用程序拥有线程越多,每个线程执行的配额时间就越少。例如,您可以将数以千计的文件分开50-50,然后使用50个异步线程按顺序上传每个部分。 –

+0

正如@Martin所说的Session类将所有文件放入队列中。 –

1

Session class的API可以只从单个线程使用。如果你从多个线程使用它,它将被阻塞。

所以如果你需要并行传输,你必须为每个线程创建一个单独的Session实例。

private async Task UploadFilesAsync(string file) 
{ 
    using (Session session = new Session()) 
    { 
     session.Open(_sessionOptions); 
     string remoteFilePath = 
      RemotePath.TranslateLocalPathToRemote(file, @"/", "/test_data_upload"); 
     session.PutFiles(file, remoteFilePath, false).Check(); 
    } 

    ... 
} 
+0

如果我创建10到20个会话,是否有任何性能问题? –

+1

这是一个相当广泛的问题。问题在客户端或服务器上?有些服务器不允许你打开那么多会话。另外创建超过3个会话也没有意义。随着更多的会话,你几乎不会获得更好的吞吐量。 –

相关问题