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

45

我有一个asp.net core API应用程序,这是我第一次使用HangFire。 在.NET Core应用程序中,所有我的方法都是异步的。 根据SO贴文,在调用Hangfire中的异步方法时使用wait() 不是一个好主意。
此外,根据hangfire支持问题 ,v1.6.0添加了异步支持。 我正在使用版本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个回答

106

根据GitHub存储库上的一个示例

只需删除Wait阻塞调用

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

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

Hangfire 1.6.0 - 博客

同步和异步方法的入队逻辑相同。在早期测试版中,会出现警告CS4014,但是现在可以删除所有的#pragmawarning disable语句了。这是通过使用Expression<Func<Task>>参数重载来实现的。

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

注意:

这不是真正的异步

请把这个特性视为一种语法糖。后台处理并没有变成异步处理。在内部,它使用了Task.Wait方法实现,因此工作线程在等待任务完成时不会执行任何处理。真正的异步处理可能只会在Hangfire 2.0中引入,并且需要对现有类型进行大量的破坏性更改。


5
好的答案(我给你点了赞)。需要指出一件事情,就是他们的文档中写道:“真正的异步可能仅在Hangfire 2.0中实现,并且需要对现有类型进行大量的重大更改。”http://hangfire.io/blog/2016/07/16/hangfire-1.6.0.html - William Xifaras
在往下阅读一点后我找到了它。它在我在答案中链接的同一篇博客文章中。谢谢。 - Nkosi
13
对于重复的任务也是如此吗? - Simon_Weaver
不要在_downloader.DownloadAsync(files)中使用ConfigureAwait(bool),否则你会不断招惹问题。 - Vikram Singh Saini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接