【问题标题】:Task indicates IsCompleted even though it is just awaiting任务指示 IsCompleted 即使它只是在等待
【发布时间】:2018-03-08 00:51:23
【问题描述】:

我有以下示例代码。问题是,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);
    }

}

【问题讨论】:

  • (不在示例中) 那么我们应该提供什么帮助?在您的示例中,task1 永远不会等待,并且 task2 会立即启动,如您在输出中看到的那样。
  • 我已经重写了文本段落。 longTask 不可能每个都完成,因为它被 while(true) 捕获。
  • 没有什么等待longTask,它所做的只是阻塞一个单独的线程。此外,您不应该在此处使用 StartNew Task.Run,尤其是当您的实际项目具有任何类型的 UI 上下文时。

标签: c# task task-parallel-library


【解决方案1】:

如果您希望 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2018-02-01
    • 2015-11-30
    相关资源
    最近更新 更多