等待任务完成

Waiting for task to be finished

我正在粘贴我编写的 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 完成,而不是等待 TaskMethod 中创建的所有任务,即执行 TaskMethod1 的任务。 我有以下问题:

  1. 如何让服务等待使用 Task.Run(() => TaskMethod1(arg1); 创建的任务。(请注意,可能有多个为 [​​=14=] 创建的任务,但 Task1 = Task.Run(() => TaskMethod()); 是 运行只有一次。)
  2. 当我 运行 Task1.wait() 为什么它不等待作为该任务的一部分创建的所有任务?
  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 并继续前进。那里没有任何东西告诉它等待任何事情。除非你在从 Task.Run 返回的 Taskawait.Wait(),否则你的代码只是继续 运行,而不依赖于 Task 你只是已创建。

这是我在您的代码中看到的问题。您的 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