【问题标题】:How to use await with hangfire background job?如何在hangfire后台作业中使用await?
【发布时间】:2018-07-27 07:43:06
【问题描述】:

我正在使用带有 .net core 2.1 的 hangfire。现在的问题是我正在使用 httpclient 发出多个 Web 请求,而我认为 hangfire 不支持异步方法。所以响应在所有 Web 请求完成之前返回。我已经评论了这一行:

_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; 
}

有什么帮助吗?

【问题讨论】:

  • “不能使用它们”?发生什么了?这里的信息远远不够,我们甚至无法尝试重现该问题。
  • 意味着它是在文档中写的 _backgroundJob.Enqueue 将自己处理异步方法但是当我使用 _backgroundJob.Enqueue 时,它​​不会等待所有 Web 请求完成
  • 您确定您使用的是支持异步的版本吗?您如何验证它不会等待它们全部完成?也许给我们看看代码?
  • 我已经用代码更新了我的问题,我正在使用最新版本的 hangfire 1.6.19
  • 该代码中的网络请求在哪里?是否正在发送电子邮件?由于在构造 EnqueueMyMethodCallBack 的返回值时没有使用 awaits 中的任何返回值,它将立即完成运行,并且任务可能会在进程的生命周期内执行。删除 return true; 并将返回类型更改为 Task - 无论如何,hangfire 不支持任何其他结果。

标签: c# asp.net asp.net-core-2.0 hangfire


【解决方案1】:

Enqueue 只是将作业添加到队列中。该作业稍后在不同的上下文中执行,甚至在可能不同的机器上(hangfire 支持多个工作机器)。它返回作业 ID,以便您稍后查询(检查状态/等)。

如果您希望您的作业在该上下文中运行,请直接调用它。

因此,如果请求需要从该作业返回某些内容,则您不需要作业。安排作业并等待它完成以便您可以返回一些东西是没有意义的。

【讨论】:

  • 肯定有用于调度作业并等待它完成的用例。如果我想在一个上下文中运行一个作业并等待它返回,你说我应该直接调用它吗?不,我不会那样做,因为我想利用 Hangfire 工作人员和队列。如果队列中有大量作业,直接调用它会跳过队列。这似乎不太理想。
  • 不等待怎么知道工作成功了?
  • @Rudey 我不认为 Hangfire 是扩展您的应用程序的正确工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2016-11-17
相关资源
最近更新 更多