Zapytanie o async/await i startowanie metody w tle

1

Hej, mam zapytanie odnośnie wywoływania metody w tle. Jeżeli przykładowo mam klase ProductLogger z metodą do logowania jak poniżej:

public async void Log()
{
     await jakasMetoda
     //przetwarzanie itp itd
}

I następnie, gdzieś w kodzie wywołuję ją bez awaita tj.:

public async Task SaveProduct(Item item)
{
      await _repo.Save(item);

      _logger.Log();
}

To czy jest to poprawne wywołanie? Moim celem jest wywołanie w tle logowania, tak aby aktualnie obslugiwany request ASP.NET Core nie musial czekac na zalogowanie., a w przypadku jakiegos błędu logowania też nie wpłynęło to na request ASP.NET Core.

0

Nie, opakuj w Task.Run(), i nigdy async void, bo zjadasz ewentualne błędy i tracisz kontrole nad wywolaniem

0
Pixello napisał(a):

Nie, opakuj w Task.Run(), i nigdy async void, bo zjadasz ewentualne błędy i tracisz kontrole nad wywolaniem

Opakowując w Task.Run() wywołanie metody z instancji dostarczanej z kontenera DI możesz dostać smutny wyjątek ObjectDisposedException. Do uruchamiania zadań w tle raczej należałoby wykorzystać klasę BackgroundService z ASP.NET Core. Ewentualnie, jeśli wywołanie jednej metody nie jest zależne od wyniku drugiej, możesz pozbyć się async/await:

public Task SaveProduct(Item item)
{
      return Task.WhenAll(_repo.Save(item), _logger.Log());
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1