Могу ли я ждать в задаче, созданной в другом потоке? Например:
...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...
А потом, по другой теме:
...
await 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!!!!!
, Почему это? Как я могу это достичь? Благодарю!
Вы можете 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 закончился !!!!!" на секунду до закрытия приложения.
thread 1 done
, иногда - нет.await
перед темTask.Run...
?