C# 如何在.NETCore3中实现并行长时间运行的后台任务?
我有一个.NET核心控制台应用程序,其中包含两个独立的任务,它们应该在应用程序的整个生命周期内并行运行。我想用: 然后像这样注册它们:C# 如何在.NETCore3中实现并行长时间运行的后台任务?,c#,.net-core,C#,.net Core,我有一个.NET核心控制台应用程序,其中包含两个独立的任务,它们应该在应用程序的整个生命周期内并行运行。我想用: 然后像这样注册它们: services.AddHostedService<BackgroundTaskOne>(); services.AddHostedService<BackgroundTaskTwo>(); services.AddHostedService(); services.AddHostedService(); 但这些都将按顺序运行。所以我
services.AddHostedService<BackgroundTaskOne>();
services.AddHostedService<BackgroundTaskTwo>();
services.AddHostedService();
services.AddHostedService();
但这些都将按顺序运行。所以我有两个问题:
class BackgroundTaskOne : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
// do work one
await Task.Delay( 100 );
}
catch (Exception e)
{
// log
}
}
}
}
医生说
实现应该返回一个任务,该任务表示正在执行的长时间运行操作的生存期
当整个工作完成时,您的实现将返回一个已完成的任务。事实上,您实现它是为了运行sync而不是async,这就是不并行运行的原因
下面是一个带有一些伪异步工作的示例实现:
class BackgroundTaskOne : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
// do work one
await Task.Delay( 100 );
}
catch (Exception e)
{
// log
}
}
}
}
正如文件所说:
在ExecuteAsync变得可用之前,不会启动其他服务
异步,例如通过调用wait
只要您没有上面的ExecuteAsync
方法中提到的async
子句,我怀疑您的方法整体上是同步的。这就是为什么两个服务是顺序调用的,而不是并行调用的。让他们休息一下,引入大量等待的代码。如文档所述:
在ExecuteAsync变得可用之前,不会启动其他服务
异步,例如通过调用wait
只要您没有上面的
ExecuteAsync
方法中提到的async
子句,我怀疑您的方法整体上是同步的。这就是为什么两个服务是顺序调用的,而不是并行调用的。让他们休息一下,介绍大量值得期待的代码。你看过MSDN吗?里面有很多好主意。你可以创建任务,你可以创建整个线程…你看过MSDN吗?里面有很多好主意。你可以创建任务,你可以创建整个线程…啊,我明白了。实际上,我在try块中执行的工作是实际的长时间运行的任务,需要在应用程序的整个生命周期中运行(只是更新了问题),所以这样做没有帮助。我想启动并忘记这两个任务。不管任务运行多长时间,你必须有一个真正的任务,而不是一个同步操作,并在我看到的末尾返回一个已完成的任务。实际上,我在try块中执行的工作是实际的长时间运行的任务,需要在应用程序的整个生命周期中运行(只是更新了问题),所以这样做没有帮助。我想启动并忘记这两个任务。不管任务运行多长时间,您必须有一个真正的任务,而不是同步操作,并在最后返回一个已完成的任务