【问题标题】:C# WinSCP .NET assembly: How to upload multiple files asynchronouslyC# WinSCP .NET 程序集:如何异步上传多个文件
【发布时间】:2017-03-24 06:58:51
【问题描述】:

我正在使用 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));
    }
}

请建议我正确的方法。谢谢

【问题讨论】:

    标签: c# asynchronous winscp winscp-net


    【解决方案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();
        }
    
        ...
    }
    

    另请参阅 WinSCP 文章 Automating transfers in parallel connections over SFTP/FTP protocol,其中包含 C# 和 PowerShell 的代码示例。

    请注意,您不应使用过多的会话/线程(大约 4 个)。随着会话的增加,您几乎不会获得更好的吞吐量。

    【讨论】:

      【解决方案2】:

      你可以像这样使用 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);
              }
      

      【讨论】:

      • 如果我需要上传数千个文件,那么将有数千个后台工作人员。应用程序和 CPU 都好吗?
      • 在一个应用程序中使用数千个广告并不是一个好的做法。因此,您的应用程序拥有的线程越多,每个线程执行的配额时间就越少。例如,您可以将数千个文件分开 50-50 个文件,并使用 50 个异步线程按顺序上传每个部分。
      • 正如@Martin 所说,Session 类会将所有文件放入队列中。
      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多