C#WinSCP.NET程序集:如何异步上载多个文件

C#WinSCP.NET程序集:如何异步上载多个文件,c#,asynchronous,winscp,winscp-net,C#,Asynchronous,Winscp,Winscp Net,我正在使用WinSCP.NET程序集上载文件。我想以异步方式上传多个文件。我已经创建了一个方法,但它可以作为单一上传 public class UploadingData { private SessionOptions _sessionOptions; private Session _session; //connection etc private void OnConnected() { foreach (var fileInfo

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

请告诉我正确的方法。谢谢

您可以像这样使用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);
        }
的API只能从单个线程使用。如果您从多个线程使用它,它将阻塞

因此,如果需要并行传输,则必须为每个线程创建一个单独的
会话
实例

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文章以及C#和PowerShell的代码示例


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

如果我需要上传数千个文件,那么将有数千个后台工作人员。对于应用程序和CPU来说,这很好吗?在一个应用程序中使用数千个AD不是一个好的实践。因此,应用程序的线程越多,每个线程执行的配额时间就越少。例如,您可以将数千个文件按50-50分开,并使用50个异步线程按顺序上载每个部分。