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());
}
}
githubのリポジトリ の例の1つに基づく
Wait
ブロッキング呼び出しを削除するだけです
_backgroungJobClient.Enqueue(() => _downloader.DownloadAsync(files));
メソッドは、Taskを返すFuncの処理方法を知っています。
エンキューのロジックは、syncメソッドとasyncメソッドで同じです。初期のベータでは警告CS4014がありましたが、すべての
#pragma
警告無効ステートメントを削除できるようになりました。Expression<Func<Task>>
パラメータオーバーロードを使用して実装されました。BackgroundJob.Enqueue(() => HighlightAsync(snippet.Id));
注:
それは本当の非同期ではありません
この機能を構文糖衣とみなしてください。バックグラウンド処理は非同期になりませんでした。内部的にはTask.Waitメソッドを使用して実装されたため、ワーカーはタスクの完了を待つ間、処理を実行しません。実際の非同期性はHangfire 2.0でのみ発生する可能性があり、既存のタイプに多くの重大な変更を加える必要があります。