如何在Hangfire中调用异步方法?

时间:2017-03-29 20:02:13

标签: c# asp.net-core hangfire

我有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());
    }
}

1 个答案:

答案 0 :(得分:33)

基于repository on github

上的一个示例

只需删除Wait拦截电话

即可
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files));

该方法现在知道如何处理返回任务的Func

Hangfire 1.6.0 - Blog

  

对于同步和异步方法,排队逻辑是相同的。在早期   贝塔有一个警告CS4014,但现在你可以删除所有   #pragma警告禁用语句。它是通过使用Expression<Func<Task>>参数重载来实现的。

BackgroundJob.Enqueue(() => HighlightAsync(snippet.Id));

注意:

  

这不是真正的异步

     

请将此功能视为语法糖。背景   处理没有变得异步。在内部,它已经实施   使用Task.Wait方法,因此工作人员不执行任何处理,   在等待任务完成时。真正的异步可能会进来   仅限Hangfire 2.0,它需要进行大量的重大更改   现有的类型。