Tengo la aplicación API central de asp.net y esta es la primera vez que usaré HangFire.
En la aplicación .Net Core, todos mis métodos son asíncronos. Según SO Post , no es una buena idea usar wait() mientras se llama al método asíncrono en hangfire.
También según el problema de soporte de hangfire en v1.6.0, se agregó soporte asíncrono. Estoy usando la versión 1.6.12 pero aún no veo soporte asíncrono.
¿Cómo llamo al método asíncrono desde Enqueue ? Actualmente estoy usando wait()
public class MyController : Controller { private readonly Downloader _downlaoder; private readonly IBackgroundJobClient _backgroungJobClient; public MyController(Downloader downloader, IBackgroundJobClient backgroungJobClient) { _downlaoder = downloader; _backgroungJobClient = backgroungJobClient; } [HttpPost] public void Post([FromBody]IEnumerable<string> files) { _backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files).Wait()); } }Basado en uno de los ejemplos en el repositorio en github
Simplemente elimine la llamada de bloqueo de Wait
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files));El método ahora sabe cómo manejar Func que devuelve Task
La lógica de puesta en cola es la misma para los métodos de sincronización y asíncrono. En las primeras versiones beta había una advertencia CS4014, pero ahora puede eliminar todas las declaraciones de desactivación de advertencia
#pragma. Se implementó mediante el uso de sobrecargas de parámetrosExpression<Func<Task>>.BackgroundJob.Enqueue(() => HighlightAsync(snippet.Id));
Nota:
Eso no es una verdadera asincronía.
Considere esta característica como un azúcar sintáctico. El procesamiento en segundo plano no se ha vuelto asíncrono. Internamente, se implementó utilizando el método Task.Wait, por lo que los trabajadores no realizan ningún procesamiento mientras esperan la finalización de una tarea. La asincronía real puede venir solo en Hangfire 2.0 y requiere muchos cambios importantes en los tipos existentes.