【问题标题】:How to invoke async methods in Hangfire?如何在 Hangfire 中调用异步方法?
【发布时间】:2017-03-29 20:02:12
【问题描述】:

我有 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 .net-core hangfire


    【解决方案1】:

    基于repository on github 上的示例之一

    只需删除 Wait 阻塞调用

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

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

    Hangfire 1.6.0 - Blog

    同步和异步方法的入队逻辑相同。在早期 betas有一个警告CS4014,但现在你可以删除所有 #pragma 警告禁用语句。它是通过使用Expression&lt;Func&lt;Task&gt;&gt; 参数重载实现的。

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

    注意:

    这不是真正的异步

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

    【讨论】:

    • 好答案(投票给你)。从他们的文档中要指出的一件事是“真正的异步可能只出现在 Hangfire 2.0 中,它需要对现有类型进行大量重大更改。” hangfire.io/blog/2016/07/16/hangfire-1.6.0.html
    • 进一步阅读后找到了它。它在我在答案中链接到的同一篇博客文章中。谢谢。
    • 重复任务也一样?
    • 永远不要将 ConfigureAwait(bool) 与 _downloader.DownloadAsync(files) 一起使用,否则您将不断出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多