我可以访问 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)