Ожидание завершения задачи - PullRequest
0 голосов
/ 15 апреля 2020

Я вставляю фрагмент службы 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(), который ожидает завершения задачи 1, но не для всех задач созданный в TaskMethod т.е. задачах, выполняющих TaskMethod1. У меня есть следующие вопросы:

  1. Как заставить службу ожидать задания, созданные с помощью Task.Run(() => TaskMethod1(arg1);. (Обратите внимание, что для Task.Run(() => TaskMethod1(arg1); может быть создано несколько задач, но Task1 = Task.Run(() => TaskMethod()); запускается только один раз.)
  2. когда я запускаю Task1.wait(), почему он не ждет всех задач, созданных как часть этой задачи?

1 Ответ

1 голос
/ 15 апреля 2020
  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();
}
Потому что Task1 не зависит от выполнения других задач. В TaskMethod() вы просто создаете Task и идете дальше. Там нет ничего, что говорит ему ждать чего-либо. Если вы не await или .Wait() в Task, возвращенном из Task.Run, ваш код просто продолжает работать без зависимости от только что созданного Task.

Это проблема Я вижу в вашем коде, как у вас есть. Ваш while(runningService) l oop будет l oop настолько быстро, насколько позволяет ваш процессор, создавая тысячи новых задач за считанные секунды. Вы уверены, что это то, что вы хотите?

Может быть, вы хотите, чтобы оно ожидало в l oop его завершения, прежде чем начинать цикл и запускать новое? Если я прав, то ваш l oop должен выглядеть так:

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 за один раз.

...