Я просто экспериментировал, чтобы увидеть, что произойдет, когда ждет холодная задача (т.е. Task, которая не была запущена). К моему удивлению, код, который всегда висел навсегда, и "Finsihed" никогда не печатается. Я бы ожидал, что будет сделано исключение.
public async Task Test1()
{
var task = new Task(() => Thread.Sleep(1000));
//task.Start();
await task;
}
void Main()
{
Test1().Wait();
Console.WriteLine("Finished");
}
Тогда, хотя, возможно, задача может быть запущена из другого потока, поэтому я изменил код на:
public async Task Test1()
{
var task = new Task(() => Thread.Sleep(1000));
//task.Start();
await task;
Console.WriteLine("Test1 Finished");
}
void Main()
{
var task1 = Test1();
Task.Run(() =>
{
Task.Delay(5000);
task1.Start();
});
task1.Wait();
Console.WriteLine("Finished");
}
Но он все еще заблокирован в task1.Wait(). Кто-нибудь знает, есть ли способ начать холодную задачу после ее ожидания?
В противном случае кажется, что нет возможности await холодной задачи, поэтому, возможно, задача должна быть запущена в ожидании или исключение должно быть исключено.
Обновление
Я ждал неправильной задачи, т.е. внешней задачи, возвращаемой Test1, а не той, которая была введена внутри него. Исключение InvalidOperationException, упомянутое @Jon Skeet, было брошено внутри Task.Run, однако, поскольку результирующая задача не наблюдалась, исключение не было выбрано в основном потоке. Ввод try/catch внутри Task.Run или вызов Wait() или Result в задаче, возвращаемой Task.Run, вызвал исключение в потоке основной консоли.