如何声明一个未启动的任务,等待另一个任务?

问题描述 投票:1回答:2

我已经完成了此单元测试,但我不明白为什么“ await Task.Delay()”不等待!

   [TestMethod]
    public async Task SimpleTest()
    {
        bool isOK = false;
        Task myTask = new Task(async () =>
        {
            Console.WriteLine("Task.BeforeDelay");
            await Task.Delay(1000);
            Console.WriteLine("Task.AfterDelay");
            isOK = true;
            Console.WriteLine("Task.Ended");
        });
        Console.WriteLine("Main.BeforeStart");
        myTask.Start();
        Console.WriteLine("Main.AfterStart");
        await myTask;
        Console.WriteLine("Main.AfterAwait");
        Assert.IsTrue(isOK, "OK");
    }

这是单元测试输出:

Unit Test Output

这怎么可能不等待,而主线程继续?

c# .net async-await task .net-4.6
2个回答
2
投票

new Task(async () =>

[任务不使用Func<Task>,而是Action。它将调用您的异步方法,并期望它在返回时结束。但事实并非如此。它返回一个任务。新任务不会等待该任务。对于新任务,一旦方法返回,作业就完成了。

您需要使用已经存在的任务,而不是将其包装在新任务中:

[TestMethod]
public async Task SimpleTest()
{
    bool isOK = false;

    Func<Task> asyncMethod = async () =>
    {
        Console.WriteLine("Task.BeforeDelay");
        await Task.Delay(1000);
        Console.WriteLine("Task.AfterDelay");
        isOK = true;
        Console.WriteLine("Task.Ended");
    };

    Console.WriteLine("Main.BeforeStart");
    Task myTask = asyncMethod();

    Console.WriteLine("Main.AfterStart");

    await myTask;
    Console.WriteLine("Main.AfterAwait");
    Assert.IsTrue(isOK, "OK");
}

0
投票

只需从task.delay(1000)中删除等待状态

success passed test<code>ms</code>

        [Fact]
        public async Task SimpleTest()
        {
            bool isOK = false;
            Task myTask = new Task(async () =>
            {
                Console.WriteLine("Task.BeforeDelay");

                /////remove await
                Task.Delay(1000);
                Console.WriteLine("Task.AfterDelay");
                isOK = true;
                Console.WriteLine("Task.Ended");
            });
            Console.WriteLine("Main.BeforeStart");
            myTask.Start();
            Console.WriteLine("Main.AfterStart");
            await myTask;
            Console.WriteLine("Main.AfterAwait");
            Assert.True(isOK, "OK");
        }

© www.soinside.com 2019 - 2024. All rights reserved.