首页 > 解决方案 > 等待任务完成

问题描述

我正在粘贴我编写的一段 Windows 服务。为了完成任务,我将默认服务终止时间更改为 30 分钟。

       private static void TaskMethod1()
       {
          //I am doing a bunch of operations here, all of them can be replaced with a sleep for 25 minutes
       }

       private static async Task TaskMethod()
       {
           while(runningService)
           {
              // Thi will create more than one task in parallel to run and each task can take upto 30 minutes to finish
              Task.Run(() => TaskMethod1(arg1);
           }
       }
       internal static void Start()
        {
            runningService = true;
            Task1 = Task.Run(() => TaskMethod());
        }

        internal static void Stop()
        {
            runningService = false;
            Task1.Wait();
        }

在上面的代码中,我写Task1.wait()了等待 task1 完成而不是等待在TaskMethodie tasks execution 中创建的所有任务TaskMethod1。我有以下问题:

  1. 如何使服务等待使用创建的任务Task.Run(() => TaskMethod1(arg1);。(请注意,可能创建了多个任务Task.Run(() => TaskMethod1(arg1);Task1 = Task.Run(() => TaskMethod());只运行一次。)
  2. 当我运行时,Task1.wait()为什么它不等待作为该任务的一部分创建的所有任务?

标签: c#async-awaitwindows-servicestask

解决方案


  1. 您必须跟踪您创建的任务,以便以后能够引用它们。例如:
private static List<Task> _taskList = new List<Task>();

private static void TaskMethod()
{
   while(runningService)
   {
      // This will create more than one task in parallel to run and each task can take upto 30 minutes to finish
      _taskList.Add(Task.Run(() => TaskMethod1(arg1)));
   }
}

internal static void Stop()
{
    runningService = false;
    Task.WaitAll(_taskList.ToArray());
    Task1.Wait();
}
  1. 因为Task1不依赖于其他任务的完成。在TaskMethod()中,您只是在创建Task并继续前进。那里没有任何东西告诉它等待任何东西。除非您await或返回 from ,否则您.Wait()的代码将继续运行,而不依赖于您刚刚创建的。TaskTask.RunTask

这是我在您的代码中看到的问题。您的while(runningService)循环将以 CPU 允许的速度循环,在几秒钟内创建数千个新任务。你确定那是你想要的吗?

也许您希望它在循环内等待它完成,然后再循环并开始一个新循环?如果我是正确的,那么你的循环应该是这样的:

private static async Task TaskMethod()
{
   while(runningService)
   {
      // This will create more than one task in parallel to run and each task can take upto 30 minutes to finish
      await Task.Run(() => TaskMethod1(arg1));
   }
}

但这一次只能创建一个Task


推荐阅读