2015-10-24 1 views
0

У меня есть два метода, работающих в потоках, используя класс Task. У меня есть третий метод, который выполняется в основном потоке. Я хочу, чтобы третий метод выполнялся после первого и второго метода. Как это сделать в следующем коде. После Firstmethod() и Secondmethod() только Thirdmethod() быть выполненаКак выполнить третий метод после первого и второго метода в C#

static void Main(string[] args) 
{ 
    Task.Factory.StartNew(() => { Firstmethod(); 
    }); 
    Task.Factory.StartNew(() => { Secondmethod(); 
    }); 

     Thirdmethod(); 
    Console.ReadLine(); 
} 

static void Firstmethod() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Console.WriteLine(i); 
    } 
} 
static void Secondmethod() 
{ 
    for (int i = 10; i < 20; i++) 
    { 
     Console.WriteLine(i); 
    } 
} 
static void Thirdmethod() 
{ 
    for (int i = 20; i < 30; i++) 
    { 
     Console.WriteLine(i); 
    } 
} 
+1

Вам нужно дождаться первой и второй задач. лучше использовать Task.WaitAll –

+0

искать AutoResetEvent/ManualResetEvent – SkryptX

+0

я использую .net 4.0 не 4.5 может любой орган отправить код для выполнения этого – peter

ответ

3

Использование Task.WaitAll. Он доступен в .NET 4.0.

static void Main(string[] args) 
{ 
    Task t1 = Task.Factory.StartNew(() => { 
     Firstmethod(); 
    }); 
    Task t2 = Task.Factory.StartNew(() => { 
     Secondmethod(); 
    }); 

    Task.WaitAll(t1, t2); 
    Thirdmethod(); 
    Console.ReadLine(); 
} 
+0

это сработало, thnaks, у вас хороший день :) – peter

1

Хотя ответ Якуба верен, он может быть более эффективным. Использование Task.WaitAll блокирует поток, а 2 других потока выполняют первую и вторую операции.

Вместо блокировки этого потока вы можете использовать его для выполнения одного из методов и только затем блокировать его. Это будет использовать только 2 потока вместо 3 и может даже вообще не блокироваться:

static void Main() 
{ 
    Task task = Task.Factory.StartNew(() => FirstMethod()); // use another thread 
    SecondMethod(); // use the current thread 
    task.Wait(); // make sure the first method completed 
    Thirdmethod(); 
}