在进度条上显示异步SSH.NET SFTP上载(BeginUploadFile)的进度

问题描述 投票:0回答:1

我在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个回答
0
投票

首先,您的代码有许多缺陷:

  • 您正在使用“异步”方法,然后您同步等待它完成。
  • 您甚至可以从GUI线程处理循环结果,而无需抽取GUI消息队列。
  • 当您创建自己的实例时,SftpUploadAsyncResult将无法获得您的上传进度。通过它“状态”对象将无济于事。你应该把UploadResult返回的BeginUploadFile投射到SftpUploadAsyncResult,而不是创造一个新的SftpUploadAsyncResult

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.