考虑这段代码:
for (int i = 0; i < 1000000; i++)
{
int i1 = i;
Task.Run(() => Console.WriteLine(i1));
}
我在上面运行代码时写了一个从 0 到 1000000 的循环,循环永远不会完成。为什么这个循环永远不会完成?
考虑这段代码:
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;
}
}