标签: iasyncoperation

如何使用 Task.Factory.FromAsync 在 Renci.SshNet.BeginDownload 中异步/等待

我可以访问 Connected Renci.SshNet.SftpClient,用它来获取 sftp 文件夹中的文件序列。用于此目的的函数是

Renci.SshNet.SftpClient.ListDirectory(string);
Run Code Online (Sandbox Code Playgroud)

由于目录中的文件数量巨大,这大约需要 7 秒。我希望能够使用 async/await 和取消令牌使我的 UI 保持响应。

如果 Renci.SshNet 有一个返回任务的 ListDirectoryAsync 函数,那么这将很容易:

async Task<IEnumerable<SftpFiles> GetFiles(SftpClient connectedSftpClient, CancellationToken token)
{
    var listTask connectedSftpClient.ListDirectoryAsync();
    while (!token.IsCancellatinRequested && !listTask.IsCompleted)
    {
        listTask.Wait(TimeSpan.FromSeconds(0.2);
    }
    token.ThrowIfCancellationRequested();
    return await listTask;
}
Run Code Online (Sandbox Code Playgroud)

可惜 SftpClient 没有异步功能。以下代码有效,但在下载过程中不会取消:

public async Task<IEnumerable<SftpFile>> GetFilesAsync(string folderName, CancellationToken token)
{
    token.ThrowIfCancellationRequested();
    return await Task.Run(() => GetFiles(folderName), token);
}
Run Code Online (Sandbox Code Playgroud)

但是,SftpClient 确实具有使用以下函数的异步功能

public IAsyncResult BeginListDirectory(string path, AsyncCallback asyncCallback, object state, Action<int> listCallback = null);
Public IEnumerable<SftpFile> EndListDirectory(IAsyncResult asyncResult);
Run Code Online (Sandbox Code Playgroud)

在将 IAsyncResult 代码转换为新的异步和等待模式 …

c# asynchronous task iasyncoperation

3
推荐指数
1
解决办法
6154
查看次数

标签 统计

asynchronous ×1

c# ×1

iasyncoperation ×1

task ×1