web-dev-qa-db-ja.com

Hangfireで非同期メソッドを呼び出す方法は?

Asp.netコアAPIアプリケーションがあり、HangFireを使用するのはこれが初めてです。

.Net Coreアプリケーションでは、すべてのメソッドが非同期です。 SO Post に基づいて、hangfireで非同期メソッドを呼び出すときにwait()を使用することはお勧めできません。
また、v1.6.0の hangfireサポートの問題 に従って、非同期サポートが追加されました。バージョン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());
    }
}
15
LP13

githubのリポジトリ の例の1つに基づく

Waitブロッキング呼び出しを削除するだけです

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

メソッドは、Taskを返すFuncの処理方法を知っています。

Hangfire 1.6.0-ブログ

エンキューのロジックは、syncメソッドとasyncメソッドで同じです。初期のベータでは警告CS4014がありましたが、すべての#pragma警告無効ステートメントを削除できるようになりました。 Expression<Func<Task>>パラメータオーバーロードを使用して実装されました。

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

注:

それは本当の非同期ではありません

この機能を構文糖衣とみなしてください。バックグラウンド処理は非同期になりませんでした。内部的にはTask.Waitメソッドを使用して実装されたため、ワーカーはタスクの完了を待つ間、処理を実行しません。実際の非同期性はHangfire 2.0でのみ発生する可能性があり、既存のタイプに多くの重大な変更を加える必要があります。

40
Nkosi