У меня есть консольная программа, которая отправляет асинхронные HTTP-запросы на внешний веб-API. (HttpClient.GetAsync());
)
Выполнение этих задач может занять несколько минут, в течение которых я хотел бы показать пользователю, что приложение все еще работает, например, отправляя Console.WriteLine("I ain't dead - yet")
каждые 10 секунд.
Я не уверен, как это сделать правильно, без риска скрыть исключения, ввести взаимоблокировки и т. Д.
Мне известен IProgress , однако я не знаю, смогу ли я представить его в этом случае. Я жду одного асинхронного вызова, который не сообщает о прогрессе. (По сути, это SDK, который вызывает метод httpClient GetAsync ()
Также:
Я не могу установить графический интерфейс на «InProgress», потому что нет графического интерфейса, это консольное приложение - и пользователю кажется, что он перестал работать, если я не время от времени отправляю сообщение об обновлении.
Текущая идея:
try
{
var task = httpClient.GetAsync(uri); //actually this is an SDK method call (which I cannot control and which does not report progress itself)
while (!task.IsCompleted)
{
await Task.Delay(1000 * 10);
this.Logger.Log(Verbosity.Verbose, "Waiting for reply...");
}
onSuccessCallback(task.Result);
}
catch (Exception ex)
{
if (onErrorCallback == null)
{
throw this.Logger.Error(this.GetProperException(ex, caller));
}
this.Logger.Log(Verbosity.Error, $"An error when executing command [{action?.Command}] on {typeof(T).Name}", ex);
onErrorCallback(this.GetProperException(ex, caller));
}