Отображение хода асинхронной загрузки SSH.NET SFTP (BeginUploadFile) на индикаторе выполнения - PullRequest
0 голосов
/ 06 сентября 2018

Я использую Renci SSH.NET в качестве SFTP-клиента в C #.
Сейчас я делаю индикатор прогресса с этим API. Я попытался с async и await, но я не мог найти решение для получения загруженных байтов. Я пробовал так:

  1. Не могли бы вы сообщить мне проблему с моим кодом?

  2. Есть ли какой-нибудь способ попробовать использовать async, ждать с 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();

1 Ответ

0 голосов
/ 06 сентября 2018

Во-первых, у вашего кода есть множество недостатков:

  • Вы используете метод «асинхронный», а затем синхронно ждете его завершения.
  • Вы даже обрабатываете результат в цикле, предположительно из потока графического интерфейса, без прокачки очереди сообщений графического интерфейса.
  • SftpUploadAsyncResult не получит прогресс загрузки, когда вы создаете свой собственный экземпляр.Передать его объект "состояние" не поможет.Вы должны привести UploadResult, возвращаемый BeginUploadFile к SftpUploadAsyncResult, вместо создания нового SftpUploadAsyncResult.

В любом случае, поскольку я не думаю, что SftpClient сам классимеет любое событие, которое будет вызывать ход выполнения загрузки, самое простое решение - использовать параметр uploadCallback (4-й) из BeginUploadFile, так же, как он используется при синхронной загрузке.См. Отображение хода загрузки файла в ProgressBar с SSH.NET .

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

И тогда сомнительно, имеет ли использование загрузки "async" какое-либо преимущество с SftpClient.Для метода Connect нет "асинхронного" варианта, поэтому вам все равно нужен поток / задание, так почему бы вам не загрузить файл из этого потока сразу же?

...