C#循环中的任务永远不会结束

时间:2013-10-05 10:30:57

标签: c# multithreading

考虑以下代码:

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

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

3 个答案:

答案 0 :(得分:7)

那是因为你永远不会等待你的任务完成。我希望你在一个控制台应用程序中运行它。控制台线程实际上会在循环完成之前退出,因为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());

答案 1 :(得分:3)

Task正在background thread中投放。当主线程停止时,所有任务都终止。如果您在代码之后添加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());

答案 2 :(得分:0)

以下适用于我的OS X Mono:

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