我在C#中使用Renci SSH.NET作为SFTP客户端。 现在我正在使用此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();
首先,您的代码有许多缺陷:
SftpUploadAsyncResult
将无法获得您的上传进度。通过它“状态”对象将无济于事。你应该把UploadResult
返回的BeginUploadFile
投射到SftpUploadAsyncResult
,而不是创造一个新的SftpUploadAsyncResult
。无论如何,因为我不认为SftpClient
类本身有任何会触发上传进度的事件,最简单的解决方案是使用uploadCallback
的BeginUploadFile
参数(4th),就像它用于同步上传一样。见Displaying progress of file upload in a ProgressBar with SSH.NET。
sftp.BeginUploadFile(
stream, remotepath + "/" + Path.GetFileName(localpath), null, null, UpdateProgresBar);
然后,使用“异步”上传是否与SftpClient
有任何优势是值得怀疑的。 Connect
方法没有“异步”变体,所以无论如何你都需要一个线程/任务,所以为什么不立即从该线程上传文件?