我不太明白之间的差别Task.Wait和await.
我在ASP.NET WebAPI服务中有类似于以下函数:
public class TestController : ApiController
{
public static async Task<string> Foo()
{
await Task.Delay(1).ConfigureAwait(false);
return "";
}
public async static Task<string> Bar()
{
return await Foo();
}
public async static Task<string> Ros()
{
return await Bar();
}
// GET api/test
public IEnumerable<string> Get()
{
Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray());
return new string[] { "value1", "value2" }; // This will never execute
}
}
Run Code Online (Sandbox Code Playgroud)
哪里Get会僵局.
什么可能导致这个?当我使用阻塞等待而不是await Task.Delay?时,为什么这不会导致问题?
任何人都可以解释一下,也许我错过了一些明显的东西.
这两个案例的行为似乎相同,但事实并非如此.
案例1:
用async Action,一段时间做一些工作来启动一个任务:
var t = Task.Run(async () => { await Task.Delay(2000); });
Run Code Online (Sandbox Code Playgroud)第二个任务等待第一个任务:
var waitingTask = Task.Run(() => { t.Wait(); });
Run Code Online (Sandbox Code Playgroud)等待第二个任务:
waitingTask.Wait();
Run Code Online (Sandbox Code Playgroud)案例2:
Task使用Task构造函数构建一个,传递相同的async Action:
var t = new Task(async () => { await Task.Delay(2000); });
Run Code Online (Sandbox Code Playgroud)启动另一个任务以等待第一个任务(就像在第一个案例中一样):
var waitingTask = Task.Run(() => { t.Wait(); });
Run Code Online (Sandbox Code Playgroud)开始第一项任务:
t.Start();
Run Code Online (Sandbox Code Playgroud)等待第二个任务:
waitingTask.Wait();
Run Code Online (Sandbox Code Playgroud)第一种情况表现如预期:等待任务在第一种情况结束后,在2秒后结束.
第二种情况很奇怪:等待任务很快就会结束,早在第一种情况发生之前.
从两个任务打印消息时很容易看到.第二个任务结束时的打印将显示差异.
我正在使用VS 2015 Preview,它可能使用Roslyn进行编译,如果这很重要的话.