![](/img/trans.png)
[英]C#/XAML HTTPclient/webrequest GET with await never ends
[英]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.