Как использовать await с фоновой работой hangfire?

Я использую Hangfire с ядром.net 2.1. Теперь проблема в том, что я использую httpclient для выполнения нескольких веб-запросов, и Hangfire, я думаю, не поддерживает асинхронные методы. Таким образом, ответ возвращается до завершения всех веб-запросов. Я прокомментировал эту строку:

_backgroundJob.Enqueue(() => EnqueueMyMethodCallBack(email)); 

и использовал эту строку:

await EnqueueMyMethodCallBack(email)

тогда все работало нормально. Так есть ли способ я могу ждать _backgroundJob.Enqueue? Также я нашел эту статью https://www.hangfire.io/blog/2016/07/16/hangfire-1.6.0.html где было написано, что асинхронные методы теперь поддерживаются, но я до сих пор не могу их использовать.

И метод EnqueueMyMethodCallBack:

public async Task<bool> EnqueueMyMethodCallBack(string email)
{
  var response = await _userRepo.GetUser(email);
  if(response == null)
    return false;
  var template = await _template.GetTemplate();
  await _email.Send(template, email);
  return true; 
}

Любая помощь?

1 ответ

Решение

Enqueue просто добавляет работу в очередь. Задание выполняется позже, в другом контексте, даже на потенциально другой машине (Hangfire поддерживает несколько рабочих машин). Он возвращает идентификатор задания, чтобы вы могли запросить его позже (проверьте статус и т. Д.).

Если вы хотите, чтобы ваша работа выполнялась в этом контексте, позвоните напрямую.

Таким образом, если запрос должен вернуть что-то с этой работы, вам не нужна работа. Нет смысла планировать работу и ждать ее завершения, чтобы вы могли что-то вернуть.

Другие вопросы по тегам