Я хочу загрузить потенциально большие партии (возможно, 100 с) файлов на FTP, используя библиотеку SSH.NET
и расширения Renci.SshNet.Async
. Мне нужно ограничить число одновременных загрузок пятью или любым количеством, которое, как я обнаружил, может обработать FTP.
Это мой код перед любыми ограничениями:
using (var sftp = new SftpClient(sftpHost, 22, sftpUser, sftpPass))
{
var tasks = new List<Task>();
try
{
sftp.Connect();
foreach (var file in Directory.EnumerateFiles(localPath, "*.xml"))
{
tasks.Add(
sftp.UploadAsync(
File.OpenRead(file), // Stream input
Path.GetFileName(file), // string path
true)); // bool canOverride
}
await Task.WhenAll(tasks);
sftp.Disconnect();
}
// trimmed catch
}
Я читал о SemaphoreSlim
, но я не до конца понимаю, как он работает и как он используется с TAP. Основываясь на документации MSDN , я бы это реализовал.
Я не уверен, правильно ли использовать Task.Run
для этого, так как он связан с вводом / выводом, и, насколько я знаю, Task.Run
для работы с процессором и async
/ await
для работы с вводом / выводом. Я также не понимаю, как эти задачи входят (это правильная терминология) в семафор, так как все, что они делают, это вызывают на нем .Release()
.
using (var sftp = new SftpClient(sftpHost, 22, sftpUser, sftpPass))
{
var tasks = new List<Task>();
var semaphore = new SemaphoreSlim(5);
try
{
sftp.Connect();
foreach (var file in Directory.EnumerateFiles(localPath, "*.xml"))
{
tasks.Add(
Task.Run(() =>
{
sftp.UploadAsync(
File.OpenRead(file), // Stream input
Path.GetFileName(file), // string path
true)); // bool canOverride
semaphore.Release();
});
}
await Task.WhenAll(tasks);
sftp.Disconnect();
}
// trimmed catch
}