当前位置:  开发笔记 > 编程语言 > 正文

SSH.Net异步文件下载

如何解决《SSH.Net异步文件下载》经验,为你挑选了1个好方法。



1> Thomas Leves..:

因为saveFileusing块中声明,它在您启动任务后立即关闭,因此无法完成下载.实际上,我很惊讶你没有得到例外.

您可以提取代码以下载到这样的单独方法:

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);
        }
    }
}


虽然在实现中不使用IO完成端口是一件令人失望的事情,但使用`Begin*`async重载创建自己的线程的优势在于,如果你需要,它们的一些IAsyncResult实现会公开一个取消机制.中途停止转移.我在一个扩展方法中包装了BeginUploadFile,让事情变得更加现代化.看看:https://gist.github.com/ronnieoverby/438034b19531e6272f98
@spersson,我更新了我的答案.看起来使用`BeginDownloadFile`没有任何优势,所以你也可以使用同步版本.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有