我正在使用 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/