【发布时间】:2014-08-05 21:34:24
【问题描述】:
我只是在尝试看看当等待一个冷任务(即尚未启动的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 返回的外部任务,而不是里面的新任务。 @Jon Skeet 提到的 InvalidOperationException 被抛出在 Task.Run 中,但是由于未观察到结果任务,因此未在主线程上抛出异常。将try/catch 放在Task.Run 中或在Task.Run 返回的任务上调用Wait() 或Result 会在主控制台线程上引发异常。
【问题讨论】:
标签: c# asynchronous async-await