首页 > 解决方案 > 使用 Task.Delay() 关闭程序

问题描述

我尝试使用 Task.Delay() 但是当程序到达那里时,无论如何它都会自行关闭。例如,在这种情况下,程序甚至无法到达该 Console.Write("*");行,它会关闭。我究竟做错了什么?任何想法?

(示例代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Whatever
{
    class Program
    {
        static async Task WriteAsync()
        {
            while (true)
            {
                await Task.Delay(1000);
                Console.Write("*");
            }

        }

        static void Main(string[] args)
        {
            WriteAsync();
        }
    }
}

标签: c#asynchronousasync-await

解决方案


帕特里克罗伯茨在问题评论中所说的,使您的主要方法异步。

知道发生了什么很有帮助,所以我会尝试分解它。

Task.Delay(1000)返回一个任务,并且该任务必须在某处等待(确实如此)。

然而,等待的任务Task.Delay(1000)被返回WriteAsync并且主要方法没有等待该任务(Task.Delay(1000)因此实际上并没有在任何地方等待)。

main 方法运行一个返回任务的方法,然后 - 立即 - 它退出,任务的工作可能已经开始,但没有任何东西(a)等待它完成,所以程序终止,任务未完成。

现在在你可以拥有的主要方法中WriteAsync().Wait()
但是,由于很多原因,不建议这样做,但主要是因为您正在同步调用异步方法,虽然它可以与这个简单的程序一起使用,但它确实是在您的程序中引入死锁的可靠方法。

相反,将您的主要方法更改为异步。
写异步代码的时候,需要一直异步

    static async Task Main(string[] args)
    {
        await WriteAsync();
    }

问题 因此,如果我主要有许多异步方法,则至少必须等待其中一个,否则程序将在任务运行之前完成

回答不,所有任务都必须等待。

    static async Task Main(string[] args)
    {
        WriteAsync01();
        await WriteAsync02();
    }    

如果在程序WriteAsync02()完成WriteAsync01()之前完成,程序将在完成之前终止WriteAsync01(),这不是您想要的。

    static async Task Main(string[] args)
    {
        await WriteAsync01();
        await WriteAsync02();
    }

这将按顺序等待这两个任务,因此在开始WriteAsync01()之前运行完成WriteAsync01(),这可能不是您想要的。

    static async Task Main(string[] args)
    {
        var task1 = WriteAsync01();
        var task2 = WriteAsync02();
        await task1;
        await task2;
    }

将启动这两个任务,但程序将等待这两个任务完成后再终止。或者,这与上述相同。

    static async Task Main(string[] args)
    {
        var task1 = WriteAsync01();
        var task2 = WriteAsync02();
        await Task.WhenAll(task1, task2);
    }

推荐阅读