任务指示 IsCompleted,即使它只是在等待

Task indicates IsCompleted even though it is just awaiting

我有以下示例代码。问题是,Task 表示 IsCompleted,即使它只是 await.

longTask只有awaits(Task.Delay())还没完,那为什么IsCompleted是真的呢? longTask不能每一个都补完,因为夹在while(true)?!

static async Task Main(string[] args)
{
    Task longTask = Task.Factory.StartNew(async () =>
    {
        while (true)
        {
            long count = 0;
            Console.WriteLine("doing hard work.");
            while (count < 99999999)
            {
                count++;
            }
            Console.WriteLine("wait for a moment");
            await Task.Delay(1000);   
            Console.WriteLine("I have waited enough");
        }
    });

    while (true)
    {
        Console.WriteLine($"status: {longTask.IsCompleted}");
        await Task.Delay(100);
    }

}

如果您希望 longTask 代表内在的、永无止境的任务,请使用适当的设置调用 .Unwrap() 或使用具有合理默认值的 Task.Run

public static class Program
{
    static async Task Main(string[] args)
    {
        Task longTask = Task.Factory.StartNew(async () =>
        {
            while (true)
            {
                long count = 0;
                Console.WriteLine("doing hard work.");
                while (count < 99999999)
                {
                    count++;
                }
                Console.WriteLine("wait for a moment");
                await Task.Delay(1000);
                Console.WriteLine("I have waited enough");
            }
        }, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default).Unwrap();
        while (true)
        {
            Console.WriteLine($"status: {longTask.IsCompleted}");
            await Task.Delay(100);
        }

    }
}

public static class Program
{
    static async Task Main(string[] args)
    {
        Task longTask = Task.Run(async () =>
        {
            while (true)
            {
                long count = 0;
                Console.WriteLine("doing hard work.");
                while (count < 99999999)
                {
                    count++;
                }
                Console.WriteLine("wait for a moment");
                await Task.Delay(1000);
                Console.WriteLine("I have waited enough");
            }
        });
        while (true)
        {
            Console.WriteLine($"status: {longTask.IsCompleted}");
            await Task.Delay(100);
        }

    }
}

更多信息:MSDN & Startnew is Dangerous