2015-10-04 7 views
2

У меня есть 3 имени методов (step1, step2, step3), и один из них имеет интенсивный расчет. У меня ситуация как Step1 и Step2 независимы друг от друга, и Step3 может быть запущен только после того, какПриложение не ждет завершения задачи

этапов с 1

Это мой код

static void Main(string[] args) 
{ 
    Console.WriteLine("Step1, Step2and Step3are independent of each other.\n"); 

    Console.WriteLine("Step1 and Step2 are independent of each other, and Step3 can be run only after Step1\n \n"); 
    Console.WriteLine("Step1 and Step2 are independent of each other, and Step3 can be run only after Step1 and Step2 finish.\n \n"); 
    Console.WriteLine(" Step1 and Step2 are independent of each other, and Step3 can be run only after Step1 or Step2 finishes.\n \n"); 

    var getCase = Int32.Parse(Console.ReadLine()); 
    switch (getCase) 
    { 
     case 1: 
      Parallel.Invoke(Step1, Step2, Step3); 
      break; 
     case 2: 
      Task taskStep1 = Task.Run(() => Step1()); 
      Task taskStep2 = Task.Run(() => Step2()); 
      Task taskStep3 = taskStep1.ContinueWith((previousTask) => Step3()); 
      Task.WaitAll(taskStep2, taskStep3); 
      break; 
     case 3: 
      Task step1Task = Task.Run(() => Step1()); 
      Task step2Task = Task.Run(() => Step2()); 
      Task step3Task = Task.Factory.ContinueWhenAll(
      new Task[] { step1Task, step2Task }, 
      (previousTasks) => Step3()); 
      step3Task.Wait(); 
      break; 
     case 4: 
      Task TaskStep1 = Task.Run(() => Step1()); 
      Task Taskstep2 = Task.Run(() => Step2()); 
      Task Taskstep3 = Task.Factory.ContinueWhenAny(
      new Task[] { TaskStep1, Taskstep2 }, 
      (previousTask) => Step3()); 
      Taskstep3.Wait(); 
      break; 
    } 


    Console.ReadLine(); 
} 


static void Step1() 
{ 
    Console.WriteLine("Step1"); 
} 
static void Step2() 
{ 
    double result = 10000000d; 
    var maxValue = Int32.MaxValue; 
    for (int i = 1; i < maxValue; i++) 
    { 
     result /= i; 
    } 
    Console.WriteLine("Step2"); 
} 
static void Step3() 
{ 
    Console.WriteLine("Step3"); 
} 

В случае 2, я получаю выхода только этапы с 1 , Шаг 3.

Где, как я написал код, чтобы подождать всю тему, чтобы завершить свою работу. поэтому выход должен быть, как этот step1, шаг 3, шаг 2

+0

Запуск этого в LINQPad, я не могу воспроизвести вашу проблему. Я получаю ожидаемый результат. –

+0

Согласен, это не проблема в случае 2. Просто подождите несколько секунд, и 'Step2' будет закончен. Только после 'Step2'' Task.WaitAll' завершается, как и планировалось. –

ответ

0

Я проверил ваш код и он работает нормально, проблема заключается в том, что переборе от 1 до Int32.MaxValue занимает много времени (около 15 секунд на моем компьютере), в этом следующем коде:

static void Step2() 
{ 
    double result = 10000000d; 
    var maxValue = Int32.MaxValue; 
    for (int i = 1; i < maxValue; i++) 
    { 
     result /= i; 
    } 
    Console.WriteLine("Step2"); 
} 

Изменить Int32.MaxValue для 3000000 и вы увидите ожидаемый результат.

Смежные вопросы