繁体   English   中英

循环中的C#任务永无止境

[英]C# Tasks in a loop never ends

考虑以下代码:

for (int i = 0; i < 1000000; i++)
{
    int i1 = i;
    Task.Run(() => Console.WriteLine(i1));
}

在上面的代码中运行时,我编写了一个从0到1000000的循环,循环从未完成。 为什么这个循环永远不会完成?

那是因为您从不等待任务完成。 我希望您在控制台应用程序中运行它。 控制台线程实际上将在循环完成之前退出,因为Task.Run与控制台应用程序的线程异步运行任务。

您要么等待任务完成,要么

        for (int i = 0; i < 1000000; i++)
        {
            int i1 = i;
            Task.Run(() => Console.WriteLine(i1)).Wait();
        }

或者您保持控制台窗口打开

    static void Main(string[] args)
    {
        for (int i = 0; i < 1000000; i++)
        {
            int i1 = i;
            Task.Run(() => Console.WriteLine(i1));
        }

        Console.ReadKey();
    }

或者您通过将所有任务添加到列表中并使用Task.WaitAll等待所有任务完成

        var tasks = new List<Task>();
        for (int i = 0; i < 1000000; i++)
        {
            int i1 = i;
            tasks.Add(Task.Run(() => Console.WriteLine(i1)));
        }

        Task.WaitAll(tasks.ToArray());

Task正在后台线程中运行。 当主线程停止时,所有任务都将终止。 如果在代码后添加Task.WaitAll ,它将可以正常工作。

List<Task> tasks = new List<Task>();
for (int i = 0; i < 10000; i++)
{
    int i1 = i;
    tasks.Add(Task.Run(() => Console.WriteLine(i1)));
}

Task.WaitAll(tasks.ToArray());

以下内容在具有Mono的OS X上完美运行:

using System.Threading.Tasks;
using System;

public class Test
{
    public static int Main(string[] args)
    {
        for (int i = 0; i < 1000000; i++)
        {
            int i1 = i;
            Task.Run(() => Console.WriteLine(i1));
        }
        return 0;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM