1

我有以下 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() 永远不会完成。但它确实编译。

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

4

1 回答 1

5

new Task(...)返回一个未启动的Task.
在你调用之前Start(),该任务永远不会完成,任何等待它的东西都不会运行。

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

于 2012-12-13T15:17:48.487 回答