Await方法返回Task - 永远旋转?

时间:2012-12-13 15:15:40

标签: c# async-await c#-5.0

我有以下NUnit测试类:

[TestFixture]
public class Tests
{
    async Task<string> GetMessageAsync()
    {
        return "Hello from GetMessageAsync!";
    }

    Task<string> GetMessageTask()
    {
        return new Task<string>(() => "Hello from GetMessageTask!");
    }

    [Test]
    public async void AwaitAsyncMethod()
    {
        Assert.AreEqual("Hello from GetMessageAsync!", await GetMessageAsync());
    }

    [Test]
    public async void AwaitTaskMethod()
    {
        Assert.AreEqual("Hello from GetMessageTask!", await GetMessageTask());
    }
}

第一个测试AwaitAsyncMethod()在执行后立即成功完成。第二个测试AwaitTaskMethod()永远不会完成。但它确实可以编译。

为什么第二次测试永远不会完成?为什么我可以针对非异步方法编译await,如果看起来它实际上不起作用?让我们说出于某种原因,我想要一个非异步方法来返回一个可以等待的任务 - 我该如何更改这个代码来实现呢?

1 个答案:

答案 0 :(得分:5)

new Task(...)会返回未启动的Task 在你致电Start()之前,这项任务永远不会完成,等待它的任何事情都永远无法运行。

相反,您可以调用Task.Run(),这将为您创建并启动任务。