使用Tamir.Sharpssh进行SFTP多重异步下载

时间:2017-03-16 16:54:33

标签: c# asynchronous async-await sftp sharpssh

我正在开发一种工具,一次从SFTP下载文件。我使用Tamir.Sharpssh连接到SFTP,我认为通过使用async和await可以实现。当我运行程序时,它完成没有错误,但我没有看到任何文件下载。

以下是我的代码,提前谢谢!

private async static void SFTPFileGetHelper()
{
    try
    {
        Task<String> task1 = GetFileAsync(sftpFile1, localFile1);
        Task<String> task2 = GetFileAsync(sftpFile2, localFile2);
        await Task.WhenAll(task1, task2);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

public static Task<String> GetFileAsync(string remoteFilePath, string localFilePath)
{
    return (Task.Run(() =>
    {
        try
        {
            Sftp conn = new Sftp(Host, Username, Password);
            conn.Connect();
            conn.Get(remoteFilePath, localFilePath);
            conn.Close();
            return remoteFilePath;
        }
        catch(Exception ex)
        {
            return ex.Message;
        }
    }));
}

2 个答案:

答案 0 :(得分:0)

我找到了答案。 我不得不将SFTPFileGetHelper()从void更改为Task。 当main函数调用SFTPFileGetHelper()时,它需要从中获取结果,在这种情况下,如果SFTP下载成功,它将返回true。

private async static Task<bool> SFTPFileGetHelper()
{
    try
    {
        Task<String> task1 = GetFileAsync(sftpFile1, localFile1);
        Task<String> task2 = GetFileAsync(sftpFile2, localFile2);
        await Task.WhenAll(task1, task2);
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

答案 1 :(得分:0)

您可以使用事件处理来检查当前进度以及上传的开始和结束:

Sftp.OnTransferStart += new FileTransferEvent(sshCp_OnTransferStart);
Sftp.OnTransferProgress += new FileTransferEvent(sshCp_OnTransferProgress);
Sftp.OnTransferEnd += new FileTransferEvent(sshCp_OnTransferEnd);


private void sshCp_OnTransferStart(string src, string dst, int transferredBytes, int totalBytes, string message)
{
    Console.WriteLine("sshCp_OnTransferStart: " + transferredBytes + "Bytes");
}

private void sshCp_OnTransferProgress(string src, string dst, int transferredBytes, int totalBytes, string message)
{
    Console.WriteLine("sshCp_OnTransferProgress: " + transferredBytes + "Bytes");
}

private void sshCp_OnTransferEnd(string src, string dst, int transferredBytes, int totalBytes, string message)
{
    Console.WriteLine("sshCp_OnTransferEnd: " + transferredBytes + "Bytes");
}