因为saveFile
在using
块中声明,它在您启动任务后立即关闭,因此无法完成下载.实际上,我很惊讶你没有得到例外.
您可以提取代码以下载到这样的单独方法:
var port = 22; string host = "localhost"; string username = "user"; string password = "password"; string localPath = @"C:\temp"; using (var client = new SftpClient(host, port, username, password)) { client.Connect(); var files = client.ListDirectory(""); var tasks = new List(); foreach (var file in files) { tasks.Add(DownloadFileAsync(file.FullName, localPath + "\\" + file.Name)); } await Task.WhenAll(tasks); client.Disconnect(); } ... async Task DownloadFileAsync(string source, string destination) { using (var saveFile = File.OpenWrite(destination)) { var task = Task.Factory.FromAsync(client.BeginDownloadFile(source, saveFile), client.EndDownloadFile); await task; } }
这样,在下载文件之前,文件不会关闭.
查看SSH.NET源代码,看起来异步版本DownloadFile
不使用"真正的"异步IO(使用IO完成端口),而只是在新线程中执行下载.所以使用BeginDownloadFile
/ 没有真正的优势EndDownloadFile
; 你也可以DownloadFile
在自己创建的一个帖子中使用:
Task DownloadFileAsync(string source, string destination) { return Task.Run(() => { using (var saveFile = File.OpenWrite(destination)) { client.DownloadFile(source, saveFile); } } }