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