簡體   English   中英

C# WinSCP .NET 程序集:如何異步上傳多個文件

[英]C# WinSCP .NET assembly: How to upload multiple files asynchronously

我正在使用 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的 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 文章 通過 SFTP/FTP 協議在並行連接中自動傳輸以及 C# 和 PowerShell 的代碼示例。

請注意,您不應使用超過幾個會話/線程(大約 4 個)。 隨着會話數的增加,您將很難獲得更好的吞吐量。

您可以像這樣使用 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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM