Отсутсвие await гарантирует выполнение async метода?

Добрый день.
Предположим есть код
public async Task<int> Process()
{
    // logic
    var i = await _context.SaveChangesAsync();

    await _notification.Notify(); // <---- возвращает таск.

    return i;
}


Как уже написал, _notification.Notify() возвращает таск, который мы может заAWAIT`ить. Но предположим, что этот метод выполняется час, а мне не нужно его ждать, чтобы выполнить return i

Вопрос: могу ли я убрать await и не ожидать завершения Notify(), но при этом быть уверенным, что он выполниться 100% (не обращая внимания на возможные возникшие внутри него исключения)
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
shai_hulud
@shai_hulud
await только подписывается на результат awaitable (в нашем случае Task). И то будет ли выполнятся этот не зависит от await т.е. от тех кто его может ждать. т.е. ответ - Да, Notify() будет себе часами молотить. Если внутри будет ошибка, то лучше подписаться на результат и скипнуть ошибку. Notify().ContinueWith(t=> { var x = t.Exception; ... });

Task.Run(async () =>
Так делать не стоит, это ошибка, которую часто совершают. 'async => ()' это уже стейт-машина которая запускается вызовом, ее не надо шедулить через таски.
Правильный пример:
new Func<Task>(async =>  {
    try
    {
        await _notification.Notify();
    } catch(Exception ex) {
        // TODO: Логируем исключение
    }
}).Invoke();

Но опять же это всё не нужно в текущей задаче, можно вызвать ContinueWith.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Вот так это делается:
Task.Run(async () =>
{
    try
    {
        await _notification.Notify();
    } catch(Exception ex) {
        // TODO: Логируем исключение
    }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы