有这么个异步方法

private static async Task Compute(int s)
{
return await Task.Run(() =>
{
if (s < 5)
return s * 2;
else
return s * 3;
});

}

当然实际过程是从数据库获取或者从网络上获取什么内容。

现在我想调用:

private static void Main(string[] args)
{
List s = new List { 1, 2, 3, 4, 5 };
List t = new List();
s.ForEach(ii =>
{
int ret = await Compute(ii);
t.Add(ret);
});

t.ForEach(ii => Console.WriteLine(ii));
}

发现 vs 划了一条下划线

OK,await 必须 async的,简单,改一下

private static void Main(string[] args)
{
List s = new List { 1, 2, 3, 4, 5 };
List t = new List();
s.ForEach(async ii =>
{
int ret = await Compute(ii);
t.Add(ret);
});

t.ForEach(ii => Console.WriteLine(ii));
}

然后,Ctrl+F5运行,报错了!

错误在

t.ForEach(ii => Console.WriteLine(ii));

原因在:Foreach 调用了一个 async void 的Action,没有await(也没法await,并且await 没返回值的也要设成Task,没法设)
老老实实改成 foreach(var ii in s)。