- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以访问 Connected Renci.SshNet.SftpClient,我用它来获取 sftp 文件夹中的一系列文件。用于此的功能是
Renci.SshNet.SftpClient.ListDirectory(string);
由于目录中有大量文件,这大约需要 7 秒。我希望能够使用 async/await 和 cancellationToken 保持我的 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;
}
唉,SftpClient 没有异步功能。以下代码有效,但在下载过程中不会取消:
public async Task<IEnumerable<SftpFile>> GetFilesAsync(string folderName, CancellationToken token)
{
token.ThrowIfCancellationRequested();
return await Task.Run(() => GetFiles(folderName), token);
}
但是,SftpClient 确实有一种使用函数的异步功能
public IAsyncResult BeginListDirectory(string path, AsyncCallback asyncCallback, object state, Action<int> listCallback = null);
Public IEnumerable<SftpFile> EndListDirectory(IAsyncResult asyncResult);
文章中Turn IAsyncResult code into the new async and await Pattern描述了如何将 IAsyncResult 转换为 await。
但是我不知道如何处理 BeginListdirectory 中的所有参数以及将 EndListDirectory 放在哪里。任何人都可以将其转换为一个任务,我可以等待很短的超时来检查取消 token ?
最佳答案
它看起来像 SftpClient
不符合标准APM pattern : listCallback
是 Begin 方法的一个额外参数。因此,我很确定您不能使用标准 FromAsync
工厂方法。
但是,您可以使用 TaskCompletionSource<T>
编写自己的代码.有点尴尬,但可行:
public static Task<IEnumerable<SftpFile>> ListDirectoryAsync(this SftpClient @this, string path)
{
var tcs = new TaskCompletionSource<IEnumerable<SftpFile>>();
@this.BeginListDirectory(path, asyncResult =>
{
try
{
tcs.TrySetResult(@this.EndListDirectory(asyncResult));
}
catch (OperationCanceledException)
{
tcs.TrySetCanceled();
}
catch (Exception ex)
{
tcs.TrySetException(ex);
}
}, null);
return tcs.Task;
}
(在浏览器中编写的代码,完全未经测试:)
我将其构造为扩展方法,这是我更喜欢的方法。这样您的消费代码就可以非常自然地执行 connectedSftpClient.ListDirectoryAsync(path)
一种呼唤。
关于c# - 如何使用 Task.Factory.FromAsync 在 Renci.SshNet.BeginDownload 中异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188202/
Closed. This question is off-topic。它当前不接受答案。
我想在列出其中的文件之前检查远程文件夹是否存在。但是这段代码给我 SftpPathNotFoundException : No such file 我知道正在检查的文件夹不存在,这就是我要处理它的原因
我想创建(我认为它是一个控制台)屏幕以在 renci ssh.net 连接之后(或期间)输入和查看输出。我目前有一个收集连接信息的 form1,然后你按下一个按钮通过 backgroundworker
我在使用 Renci SSH SFTP 将文件从 ASP.NET 服务器上传到我们的 CDN (Akamai) 时遇到问题。在启动问题之前,我们一直在使用 FTP 上传媒体,超过 ~50MB 的任何内
我正在使用 Renci.SshNet.Sftp 连接到 SFTP。当我尝试调用 sftpClientObject.Connect() 时出现以下错误。请在下面找到错误。几天前它工作正常。检查了身份验证
我们最近将一个项目部署到生产环境中,现在当我们尝试连接到外部 sftp 机器时收到此错误消息,“无法建立连接,因为目标机器主动拒绝它”。当我开发应用程序并对其进行测试时,我们在连接到该服务器时没有遇到
有谁知道是否可以使用 SSH.NET 库 (Renci.SshNet) 以编程方式更改 SFTP 站点上的用户密码?无论哪种方式,我都无法找到任何确定的信息。 如果是,我将不胜感激您能提供的任何指示。
我想连接一个 SSH 服务器,在连接时运行一个自定义命令,该命令需要 XML 作为输入(UTF-8 编码,多行,在每个 XML 文档的末尾有一个特殊的行标记它的结束)和输出 XML(UTF-8 编码,
我正在开发一个简单的 WPF 应用程序,其唯一目的是使用 Renci SSH.net 库获取 SshClient 的工作目录并将其进一步传递给 SftpClient。 我似乎无法使用从 RunComm
我正在使用 .NET 库 Renci.SshNet 连接到远程 Solaris 机器(它是 ESXi 上的 VM)。它连接良好。 我使用以下方法执行命令并获取标准输出。这在任何 Linux 机器和几乎
我已经看到关于此错误的其他线程,但我随机遇到此错误。在 30 个连接中,有 12 个出现此错误。试图了解这是为什么,以及可能的解决方案是什么。 using (SftpClient client = n
我正在 WPF 应用程序上使用 Renci SSH.Net 库,但在使用 SFTP 客户端时遇到问题。当用户尝试连接以从 SFTP 服务器下载一些文件时,他会收到如下所示的消息: Server res
尝试使用 Renci 主机 SSH 库访问 MySQL 服务器。 我按照信息 Creating a forwarded port within an SSH tunnel 让它工作了 特别是这一行成功
我尝试在 Windows 10 64 位系统上使用 PowerShell 5.1 连接到远程 MySQL 服务器。我使用 Powershell x86 和 64 位版本。 当我使用 System.Da
我有一个 key 文件,正在与 Renci.ssh 一起使用来执行 sftp。但是,如果我将此文件复制并粘贴到 Azure Secret 中,当我运行相同的代码并尝试从 Azure Key Vault
我有一个 key 文件,正在与 Renci.ssh 一起使用来执行 sftp。但是,如果我将此文件复制并粘贴到 Azure Secret 中,当我运行相同的代码并尝试从 Azure Key Vault
我可以访问 Connected Renci.SshNet.SftpClient,我用它来获取 sftp 文件夹中的一系列文件。用于此的功能是 Renci.SshNet.SftpClient.ListD
我正在使用 Renci SSH.NET,但尝试在 FTP(不是 SFTP 站点)上进行测试。 我确实可以在 WinSCP 上使用它 - 但无法在 Renci 上使用它 -WinSCP 允许我将协议(p
我目前正在尝试使用 Renci SSH.NET 将文件复制到使用 SFTP 的 Unix 服务器,此外,我想创建一个指向已复制文件的符号链接(symbolic link)。这基本上是我的代码的样子,注
我需要在大型机上启动一个专有的 SSH 子系统。 我已将我的项目迁移到 dotnet core,但它不支持 ch.ethz.ssh2。我已将 lib 更改为 Renci.SSHNET,但没有在远程机器
我是一名优秀的程序员,十分优秀!