我有asp.net核心API应用程序,这是我第一次使用HangFire。
在.Net Core应用程序中,我的所有方法都是异步的。基于SO Post,在hangfire中调用异步方法时使用wait()
并不是一个好主意。
另外,根据v1.6.0中的hangfire support issue,添加了异步支持。我使用的是1.6.12版,但我仍然没有看到异步支持。
我如何从Enqueue
调用异步方法。目前我正在使用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());
}
}
基于repository on github上的一个例子
只需删除Wait
阻止呼叫
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files));
该方法现在知道如何处理返回Task的Func
对于同步和异步方法,排队逻辑是相同的。在早期的测试版中有一个警告CS4014,但现在你可以删除所有
#pragma
警告禁用语句。它是通过使用Expression<Func<Task>>
参数重载实现的。BackgroundJob.Enqueue(() => HighlightAsync(snippet.Id));
注意:
这不是真正的异步
请将此功能视为语法糖。后台处理尚未异步。在内部,它是使用Task.Wait方法实现的,因此工作人员在等待任务完成时不执行任何处理。真正的异步可能只出现在Hangfire 2.0中,它需要对现有类型进行大量重大更改。