【问题标题】:Display progress of asynchronous SSH.NET SFTP upload (BeginUploadFile) on progress bar在进度条上显示异步 SSH.NET SFTP 上传 (BeginUploadFile) 的进度
【发布时间】:2018-09-07 14:26:33
【问题描述】:

我在 C# 中使用 Renci SSH.NET 作为 SFTP 客户端。
现在我正在用这个 API 制作一个进度条。我尝试了异步和等待,但我找不到获取下载字节的解决方案。我试过这样:

  1. 你能告诉我我的代码有问题吗?

  2. 有什么方法可以尝试使用异步,等待 Renci SSH.NET?并从 API 获取一些下载或上传的字节。

IAsyncResult UploadResult = sftp.BeginUploadFile(stream, remotepath + "/" + 
Path.GetFileName(localpath));

SftpUploadAsyncResult UploadProgress = new SftpUploadAsyncResult(null, UploadResult.AsyncState);

Window_Progress wp = new Window_Progress();
Point _pt = MainWindow.current.PointToScreen(new 
Point((MainWindow.current.Width - wp.Width) / 2,
(MainWindow.current.Height - wp.Height) / 2));
wp.Left = _pt.X;
wp.Top = _pt.Y;

while (!UploadProgress.IsCompleted)
{
    UploadProgress = new SftpUploadAsyncResult(null,UploadResult.AsyncState);
    Thread.Sleep(10);
    wp.PartialProgressBar.Value = (UploadProgress.UploadedBytes / 
    FilesAndDirectory.GetSize(localpath) * 100);
}

UploadProgress.AsyncWaitHandle.WaitOne();
wp.Close();

【问题讨论】:

  • 不清楚你在问什么。你有错误吗?如果有,请复制到这里。您遇到了什么问题?

标签: c# .net progress-bar sftp ssh.net


【解决方案1】:

首先,你的代码有很多缺陷:

  • 您正在使用“异步”方法,然后您同步等待它完成。
  • 您甚至可以在循环中处理结果,可能来自 GUI 线程,而无需泵送 GUI 消息队列。
  • 当您创建自己的实例时,SftpUploadAsyncResult 不会获得您的上传进度。将它传递给“状态”对象将无济于事。您应该将BeginUploadFile 返回的UploadResult 转换为SftpUploadAsyncResult,而不是创建一个新的SftpUploadAsyncResult

无论如何,因为我不认为SftpClient 类本身有任何会触发上传进度的事件,最简单的解决方案是使用BeginUploadFileuploadCallback 参数(第4 个),与同步使用的方式相同上传。见Displaying progress of file upload in a ProgressBar with SSH.NET

sftp.BeginUploadFile(
    stream, remotepath + "/" + Path.GetFileName(localpath), null, null, UpdateProgresBar);

然后值得怀疑的是,使用“异步”上传是否对SftpClient 有任何优势。 Connect 方法没有“异步”变体,因此无论如何您都需要一个线程/任务,那么为什么不立即从该线程上传文件呢?

【讨论】:

  • 哦,太完美了!!真的非常感谢!希望你有一个愉快的一天
  • 我同意 BeginUploadFile 的“异步”方面没有太多优势,因为您可能已经在一个单独的线程中,但它确实具有取消操作的方法的优势(使用 SftpUploadAsyncReslut 的 IsUploadCanceled 属性,UploadFile 的 CallBack 没有,所以我用它代替 UploadFile。
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多