等待一个空的Task永久旋转(等待新任务(()=> {}))
我试图让我的头绕过这段代码:
[TestFixture]
public class ExampleTest
{
[Test]
public void Example()
{
AwaitEmptyTask().Wait();
}
public async Task AwaitEmptyTask()
{
await new Task(() => { });
}
}
方法Example
永远不会结束并永远阻塞。 为什么??
修复 (从异步单元测试中的Stubbing Task返回方法)是用return Task.FromResult<object>(null);
替换await new Task( () => {})
return Task.FromResult<object>(null);
但是,为什么这是必要的?
我知道有一堆类似于这个问题的问题,但是我没有看到任何问题似乎可以解释为什么会发生这种情况:
await
关键字AFAIK Task.FromResult
但不是为什么await new Task(() => {})
不起作用 你正在创建一个任务并且从不启动它,所以它永远不会结束。
你应该使用Task.Run
创建一个你想立即开始执行的Task
,而不是使用Task
构造函数。
你需要在你的任务上调用Start()
。
否则,它永远不会完成。
即使你改变了
await Task.Run(() => { });
它可能永远不会完成。 当你点击这一行时,程序会创建一个继续任务,任务完成后继续任务。 任务是空的这一事实是无关紧要的。 此时,控制流程返回
AwaitEmptyTask().Wait();
等待任务完成并阻止当前线程。
任务完成后,它会尝试在当前线程上继续。 但是,它不能,因为线程被Wait()的调用阻塞。
将等待的行更改为
await Task.Run(() => { }).ConfigureAwait(false);
这是一个常见的死锁问题。 不要混合等待()并等待。 请参阅http://msdn.microsoft.com/en-us/magazine/jj991977.aspx
链接地址: http://www.djcxy.com/p/79317.html上一篇: Awaiting an empty Task spins forever (await new Task(() => { }))