2016-12-12 2 views
1

Могу ли я ждать задания, созданного в другом потоке? Например:Как подождать одной задачи на двух разных потоках?

... 
CurrentIteration = Execute(); // returns Task 
await CurrentIteration; 
... 

А потом, в другом потоке:

... 
await CurrentIteration; 
... 

1) Будет ли второй поток ждать метод Execute, чтобы закончить выполнение? 2) Если это будет, я буду иметь возможность повторно использовать CurrentIteration для той же цели во втором потоке, учитывая, что я повторно запустить

CurrentIteration = Execute(); // returns Task 
await CurrentIteration; 

На первом потоке?

Я устал этот код:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     MainAsync(args).GetAwaiter().GetResult(); 
    } 
    public static async Task MainAsync(string[] args) 
    { 

     var instance = new SomeClass(); 
     var task = instance.Execute(); 
     Console.WriteLine("thread 1 waiting..."); 
     Task.Run(async() => 
     { 
      Console.WriteLine("thread 2 started... waiting..."); 
      await task; 
      Console.WriteLine("thread 2 ended!!!!!"); 
     }); 

     await task; 

     Console.WriteLine("thread 1 done!!"); 

     Console.ReadKey(); 
    } 
} 


public class SomeClass 
{ 
    public async Task Execute() 
    { 
     await Task.Delay(4000); 
    } 
} 

Но он печатает

thread 1 waiting... 
thread 2 started... waiting... 

затем

thread 1 done!! 

но никогда thread 2 ended!!!!!. Почему это? Как я могу это достичь? Благодаря!

+2

Вы не ожидаете задачи, с которой вы начинаете. На самом деле, вы должны получить предупреждение в intellisense, говорящее вам только об этом. Если вы этого не ожидаете, иногда он будет выполняться до 'thread 1 done', иногда это не будет. – Rob

+0

Вы имеете в виду, что я должен поставить 'await' перед' Task.Run ... '? – nicks

+0

Это правильно, да – Rob

ответ

3

await Задача из нескольких потоков. Вы действительно были действительно близки к тому, чтобы это работало, как сказал @Rob, вам просто нужно было сделать await второй поток.

считают это:

public static async Task MainAsync(string[] args) 
    { 

     var instance = new SomeClass(); 
     var task = instance.Execute(); 
     Console.WriteLine("thread 1 waiting..."); 
     var secondTask = Task.Run(async() => 
     { 
      Console.WriteLine("thread 2 started... waiting..."); 
      await task; 
      Console.WriteLine("thread 2 ended!!!!!"); 
     }); 

     await task; 

     await secondTask; 

     Console.WriteLine("thread 1 done!!"); 

     Console.ReadKey(); 
    } 

Добавить ожидание на второй нити после завершения ожидании задачи.

Причина, по которой вы не видите индикацию, состоит в том, что консоль застряла в методе ReadKey и ничего не могла написать, пока она не будет закончена. Если бы вы нажали Enter, вы увидите, что «поток 2 закончился !!!!!» на секунду до закрытия приложения.

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