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

问题描述 投票:12回答:1

我有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());
    }
}
c# asp.net-core hangfire
1个回答
35
投票

基于repository on github上的一个例子

只需删除Wait阻止呼叫

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

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

Hangfire 1.6.0 - Blog

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

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

注意:

这不是真正的异步

请将此功能视为语法糖。后台处理尚未异步。在内部,它是使用Task.Wait方法实现的,因此工作人员在等待任务完成时不执行任何处理。真正的异步可能只出现在Hangfire 2.0中,它需要对现有类型进行大量重大更改。

© www.soinside.com 2019 - 2024. All rights reserved.