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 的“ASP.NET 上的 Fire and Forget”和 Scott Hanselman 的“如何在 ASP.NET 中运行后台任务”中详细介绍的技术。 这些资源提供了更复杂、更可靠的方法来处理 ASP.NET Core 环境中长时间运行或异步后台进程。
以上是如何在ASP.NET Core中递归安排异步任务?的详细内容。更多信息请关注PHP中文网其他相关文章!