1

考虑这段代码:

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

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

4

3 回答 3

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());
于 2013-10-05T10:38:21.877 回答
3

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());
于 2013-10-05T10:38:56.113 回答
0

以下在我的带有 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;
    }
}
于 2013-10-05T10:37:50.250 回答