等待一个空的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); 但是,为什么这是必要的?

我知道有一堆类似于这个问题的问题,但是我没有看到任何问题似乎可以解释为什么会发生这种情况:

  • 等待返回Task的方法 - 永久旋转?:我正确包含了await关键字AFAIK
  • 异步单元测试中的Stubbing Task返回方法:不解释原因。
  • 为什么一个空的.NET任务如果从一个静态构造函数启动并等待时没有完成?:我没有在静态上下文中运行,并且据我所知,上下文是一致的
  • 异步方法返回null:也提供了解决方案,但不解释原因
  • 异步等待返回任务:讨论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(() => { }))

    下一篇: multithreading in regards toTask, async, and await