Используйте обработчик событий и поднимите его в действии прогресса.обработчик событий разрешит асинхронные вызовы.
К счастью Progress<T>
имеет событие ProgressChanged
, на которое вы можете подписаться.
Просмотрите следующий пример на основе представленного кода в исходной задаче
public async Task UploadFile(string id) {
EventHandler<double> handler = null;
//creating the handler inline for compactness
handler = async (sender, value) => {
//send message to client asynchronously
await Clients.Client(id).SendAsync("FTPUploadProgress", value);
};
var progress = new Progress<double>();
progress.ProgressChanged += handler;//subscribe to ProgressChanged event
//use the progress as you normally would
await client.DownloadFileAsync(localPath, remotePath, true, FluentFTP.FtpVerify.Retry, progress);
//unsubscribe when done
progress.ProgressChanged -= handler;
}
Так что теперь, когда сообщается о прогрессе, обработчик событий может выполнить асинхронный вызов.
Ссылка Асинхронное / ожидание - Рекомендации по асинхронному программированию
Другой вариант - создать собственную реализацию IProgress<T>
, которая принимает Func<Task<T>>
, которая допускает асинхронные вызовы, но это может быть излишним.