ASP.NET Core アプリケーションでは、多くの場合、ユーザーの要求に影響を与えることなく、バックグラウンド タスクを定期的に実行する必要があります。 この記事では、JavaScript の setInterval()
.
課題:
目標は、ユーザーの操作をブロックすることなく、非同期メソッド (収集したデータをリモート サービスに送信するなど) を定期的に実行することです。 難しいのは、この非同期タスクを適切にスケジュールすることです。
簡単な解決策 (注意事項あり):
.NET の Timer
クラスは、Elapsed
イベントを使用して、簡単なアプローチを提供します。 ただし、必要な署名 (void MethodName(object e, ElapsedEventArgs args)
) は、async
メソッドの署名 (async Task MethodName(object e, ElapsedEventArgs args)
) と互換性がありません。
Task.Delay()
を使用した回避策:
この非互換性は、内部的にタイマーを利用する while
ループと Task.Delay()
を使用して克服できます。
<code class="language-csharp">public async Task PeriodicFooAsync(TimeSpan interval, CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { await FooAsync(); await Task.Delay(interval, cancellationToken); } }</code>
これにより、指定された FooAsync()
で interval
が事実上実行されます。 重要な追加点は cancellationToken
です。これにより、タスクの正常な終了が可能になります。これは、アプリケーションのシャットダウン時に特に重要です。
ASP.NET Core に関する重要な考慮事項:
このアプローチは一般的な .NET アプリケーションでは機能しますが、ASP.NET Core 内では注意が必要です。 このメソッドの「ファイアアンドフォーゲット」の性質により、問題が発生する可能性があります。 ASP.NET Core で堅牢なバックグラウンド タスクを管理するには、Hangfire などの確立されたソリューション、または Stephen Cleary の「Fire and Forget on ASP.NET」や Scott Hanselman の「ASP.NET でバックグラウンド タスクを実行する方法」で詳しく説明されている手法を検討してください。 これらのリソースは、ASP.NET Core 環境内で長時間実行または非同期のバックグラウンド プロセスを処理するための、より洗練された信頼性の高い方法を提供します。
以上がASP.NET Core で非同期タスクを再帰的にスケジュールするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。