C# 如何在.NETCore3中实现并行长时间运行的后台任务?

C# 如何在.NETCore3中实现并行长时间运行的后台任务?,c#,.net-core,C#,.net Core,我有一个.NET核心控制台应用程序,其中包含两个独立的任务,它们应该在应用程序的整个生命周期内并行运行。我想用: 然后像这样注册它们: services.AddHostedService<BackgroundTaskOne>(); services.AddHostedService<BackgroundTaskTwo>(); services.AddHostedService(); services.AddHostedService(); 但这些都将按顺序运行。所以我

我有一个.NET核心控制台应用程序,其中包含两个独立的任务,它们应该在应用程序的整个生命周期内并行运行。我想用:

然后像这样注册它们:

services.AddHostedService<BackgroundTaskOne>();
services.AddHostedService<BackgroundTaskTwo>();
services.AddHostedService();
services.AddHostedService();
但这些都将按顺序运行。所以我有两个问题:

  • 有没有办法让这两个并行运行
  • 在.NETCore中并行运行两个长期运行的后台进程,还有其他选择吗
  • 医生说

    实现应该返回一个任务,该任务表示正在执行的长时间运行操作的生存期

    当整个工作完成时,您的实现将返回一个已完成的任务。事实上,您实现它是为了运行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
                }
            }
        }
    }
    
    医生说

    实现应该返回一个任务,该任务表示正在执行的长时间运行操作的生存期

    当整个工作完成时,您的实现将返回一个已完成的任务。事实上,您实现它是为了运行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块中执行的工作是实际的长时间运行的任务,需要在应用程序的整个生命周期中运行(只是更新了问题),所以这样做没有帮助。我想启动并忘记这两个任务。不管任务运行多长时间,您必须有一个真正的任务,而不是同步操作,并在最后返回一个已完成的任务