Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SSH.Net异步文件下载_C#_Asynchronous_Sftp_Ssh.net - Fatal编程技术网

C# SSH.Net异步文件下载

C# SSH.Net异步文件下载,c#,asynchronous,sftp,ssh.net,C#,Asynchronous,Sftp,Ssh.net,我正在尝试使用SSH.NET从SFTP服务器异步下载文件。如果我同步执行,它可以正常工作,但当我异步执行时,会得到空文件。这是我的代码: var port = 22; string host = "localhost"; string username = "user"; string password = "password"; string localPath = @"C:\temp"; using (var client = new SftpClient(host, port, user

我正在尝试使用SSH.NET从SFTP服务器异步下载文件。如果我同步执行,它可以正常工作,但当我异步执行时,会得到空文件。这是我的代码:

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<Task>();

    foreach (var file in files)
    {                        
        using (var saveFile = File.OpenWrite(localPath + "\\" + file.Name))
        {
            //sftp.DownloadFile(file.FullName,saveFile); <-- This works fine
            tasks.Add(Task.Factory.FromAsync(client.BeginDownloadFile(file.FullName, saveFile), client.EndDownloadFile));
        }                        
    }

    await Task.WhenAll(tasks);
    client.Disconnect();

}
var端口=22;
string host=“localhost”;
字符串username=“user”;
字符串password=“password”;
字符串localPath=@“C:\temp”;
使用(var客户端=新的SftpClient(主机、端口、用户名、密码))
{
client.Connect();
var files=client.ListDirectory(“”);
var tasks=新列表();
foreach(文件中的var文件)
{                        
使用(var saveFile=File.OpenWrite(localPath+“\\”+File.Name))
{

//sftp.DownloadFile(file.FullName,saveFile);因为
saveFile
是在
中使用
块声明的,它在您开始任务后立即关闭,因此下载无法完成。实际上,我很惊讶您没有收到异常

您可以提取代码以下载到单独的方法,如下所示:

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<Task>();

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

谢谢你的回答,但是,当我尝试此操作时,仍然会得到相同的空文件。也没有例外。@spersson,我更新了我的答案。看起来使用
BeginDownloadFile
没有任何好处,所以你最好使用同步版本。感谢你花时间,我想我会使用同步版本:)尽管它是令人遗憾的是,他们在实现中没有使用IO完成端口,使用
Begin*
async重载比创建自己的线程更有优势,因为如果您需要中途停止传输,他们的一些IAsyncResult实现会暴露一种取消机制让事物感觉更现代。请查看:
Task DownloadFileAsync(string source, string destination)
{
    return Task.Run(() =>
    {
        using (var saveFile = File.OpenWrite(destination))
        {
            client.DownloadFile(source, saveFile);
        }
    }
}