C# 带有同步方法调用的异步任务

C# 带有同步方法调用的异步任务,c#,async-await,C#,Async Await,我从新的.NET4.5Async编程开始,我发现了一种类似于下面代码的情况:我有一个sync方法,但我想进行几个调用并使其并行运行。然而,在这段代码中,对sync方法的所有调用都以id=10运行,我不知道为什么(可能我误解了这种新方法的某些内容:) 类程序 { 静态void Main(字符串[]参数) { var tasks=新列表(); 对于(int i=0;ifoo.foonAsyncMethod(i)); 任务。添加(步法); } tasks.ForEach(t=>t.Wait()); 控

我从新的.NET4.5Async编程开始,我发现了一种类似于下面代码的情况:我有一个sync方法,但我想进行几个调用并使其并行运行。然而,在这段代码中,对sync方法的所有调用都以id=10运行,我不知道为什么(可能我误解了这种新方法的某些内容:)

类程序
{
静态void Main(字符串[]参数)
{
var tasks=新列表();
对于(int i=0;i<10;i++)
{
var foo=new foo();
var fooTask=Task.Run(()=>foo.foonAsyncMethod(i));
任务。添加(步法);
}
tasks.ForEach(t=>t.Wait());
控制台。WriteLine(“全部完成!”);
Console.ReadLine();
}
}
公开课Foo
{
公共void非同步方法(int-id)
{
WriteLine(“起始{0}”,id);
睡眠(4000);
WriteLine(“结束{0}”,id);
}
}
//输出:
//从10开始
//从10开始
//从10开始
//从10开始
//结束10
//从10开始
//从10开始
//结束10
//结束10
// ...

这是因为只有一个变量
i
,lambda表达式绑定到一个变量而不是一个值上

您可以使用以下方法解决此问题:

for (int i = 0; i < 10; i++)
{
    int newI = i;
    var foo = new Foo();
    var fooTask = Task.Run(() => foo.FooNonAsyncMethod(newI));
    tasks.Add(fooTask);
}
for(int i=0;i<10;i++)
{
int newI=i;
var foo=new foo();
var fooTask=Task.Run(()=>foo.foonAsyncMethod(newI));
任务。添加(步法);
}

正如@Yuriy所提到的,这个答案有很多关于这个特殊性的信息:

这是因为只有一个变量
i
,lambda表达式绑定在一个变量上,而不是一个值

您可以使用以下方法解决此问题:

for (int i = 0; i < 10; i++)
{
    int newI = i;
    var foo = new Foo();
    var fooTask = Task.Run(() => foo.FooNonAsyncMethod(newI));
    tasks.Add(fooTask);
}
for(int i=0;i<10;i++)
{
int newI=i;
var foo=new foo();
var fooTask=Task.Run(()=>foo.foonAsyncMethod(newI));
任务。添加(步法);
}

正如@Yuriy提到的,这个答案有很多关于这个特殊性的信息:

可能重复的@Yuriy不是重复的,因为它是关于
foreach
的。但这肯定回答了问题。使用
Task.WaitAll
而不是
tasks.ForEach(t=>t.Wait())
可能重复的@Yuriy不是重复的,因为它是关于
foreach
的,这里是
for
。但这肯定回答了问题。使用
Task.WaitAll
而不是
tasks.ForEach(t=>t.Wait())