Я просто экспериментировал, чтобы увидеть, что произойдет, когда ждет холодная задача (т.е. 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
, вызвал исключение в потоке основной консоли.