Во-первых, у вашего кода есть множество недостатков:
- Вы используете метод «асинхронный», а затем синхронно ждете его завершения.
- Вы даже обрабатываете результат в цикле, предположительно из потока графического интерфейса, без прокачки очереди сообщений графического интерфейса.
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
нет "асинхронного" варианта, поэтому вам все равно нужен поток / задание, так почему бы вам не загрузить файл из этого потока сразу же?