C# WinSCP .NET 程序集 : How to upload multiple files asynchronously

标签 c# asynchronous winscp winscp-net

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

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

最佳答案

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 的代码示例。

请注意,您不应使用超过几个 session /线程(大约 4 个)。 session 越多,您将很难获得更好的吞吐量。

关于C# WinSCP .NET 程序集 : How to upload multiple files asynchronously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40524377/

相关文章:

C# 元组与列表注意事项

c# - 我们如何以及在哪里编写 try catch block 来处理异常

ios - 在多个异步方法之后执行代码

在R中运行异步功能

sql-server - 当使用 WinSCP 选择要上传到 FTP 服务器的文件的掩码不匹配任何文件时,SSIS 任务失败

linux - 是否有适用于 Linux 的 WinSCP?

C# 在任务栏上显示文本 | window 10

c# - 从服务器保存 html 文件

networking - 如何在 Clojure (/Java) 中稳健地发出大量并发 HTTPS 请求

linux - 在 VirtualBox 上连接 WinSCP 和 Ubuntu