C# 任务指示已完成,即使它正在等待

C# 任务指示已完成,即使它正在等待,c#,task,task-parallel-library,C#,Task,Task Parallel Library,我有下面的示例代码。问题是,任务指示已完成,即使它只是等待 longstask仅等待s(Task.Delay())且尚未完成,那么为什么IsCompleted为真长任务不可能每个任务都完成,因为它在(true)时被捕获了 static async Task Main(字符串[]args) { Task longTask=Task.Factory.StartNew(异步()=> { while(true) { 长计数=0; Console.WriteLine(“努力工作”); 而(计数 { whi

我有下面的示例代码。问题是,
任务
指示
已完成
,即使它只是等待

longstask
等待
s(Task.Delay())且尚未完成,那么为什么
IsCompleted
为真<代码>长任务不可能每个任务都完成,因为它在(true)时被捕获了

static async Task Main(字符串[]args)
{
Task longTask=Task.Factory.StartNew(异步()=>
{
while(true)
{
长计数=0;
Console.WriteLine(“努力工作”);
而(计数<9999999)
{
计数++;
}
Console.WriteLine(“稍等片刻”);
等待任务。延迟(1000);
Console.WriteLine(“我已经等够了”);
}
});
while(true)
{
WriteLine($“状态:{longTask.IsCompleted}”);
等待任务。延迟(100);
}
}

如果希望
长任务
表示内部的、永不结束的任务,请使用适当的设置调用
.Unwrap()
,或使用
任务。运行具有合理默认值的

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);
        }

    }
}
公共静态类程序
{
静态异步任务主(字符串[]args)
{
Task longTask=Task.Factory.StartNew(异步()=>
{
while(true)
{
长计数=0;
Console.WriteLine(“努力工作”);
而(计数<9999999)
{
计数++;
}
Console.WriteLine(“稍等片刻”);
等待任务。延迟(1000);
Console.WriteLine(“我已经等够了”);
}
},CancellationToken.None,TaskCreationOptions.denychildatatch,TaskScheduler.Default)。展开();
while(true)
{
WriteLine($“状态:{longTask.IsCompleted}”);
等待任务。延迟(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);
        }

    }
}
公共静态类程序
{
静态异步任务主(字符串[]args)
{
Task longTask=Task.Run(异步()=>
{
while(true)
{
长计数=0;
Console.WriteLine(“努力工作”);
而(计数<9999999)
{
计数++;
}
Console.WriteLine(“稍等片刻”);
等待任务。延迟(1000);
Console.WriteLine(“我已经等够了”);
}
});
while(true)
{
WriteLine($“状态:{longTask.IsCompleted}”);
等待任务。延迟(100);
}
}
}

更多信息:&

(示例中没有),那么我们应该在哪些方面提供帮助?在您的示例中,task1从未等待,task2会立即启动,正如您在输出中看到的。我已重写了这段文字<代码>长任务
不能每次都完成,因为它在
中被捕获,而(true)
。没有什么等待
长任务
,它所做的只是阻塞一个单独的线程。此外,您不应该在这里使用
StartNew
任务。Run
可能是您的想法,特别是如果您的实际项目具有任何类型的UI上下文。
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);
        }

    }
}