具有同步方法调用的异步任务

本文关键字:异步 任务 调用 同步方法 | 更新日期: 2023-09-27 18:19:54

我从新的.net 4.5异步编程开始,发现了如下代码所示的情况:我有一个sync方法,但我想进行几个调用并使其并行运行。然而,在这段代码中,所有对sync方法的调用都是在id=10的情况下运行的,我不知道为什么(可能我误解了这种新方法:)。

class Program
{
    static void Main(string[] args)
    {
        var tasks = new List<Task>();
        for (int i = 0; i < 10; i++)
        {
            var foo = new Foo();
            var fooTask = Task.Run(() => foo.FooNonAsyncMethod(i));
            tasks.Add(fooTask);
        }
        tasks.ForEach(t => t.Wait());
        Console.WriteLine("All Done!");
        Console.ReadLine();
    }
}
public class Foo
{
    public void FooNonAsyncMethod(int id)
    {
        Console.WriteLine("Starting {0}", id);
        Thread.Sleep(4000);
        Console.WriteLine("Ending {0}", id);
    }
}
// Output:
// Starting 10
// Starting 10
// Starting 10
// Starting 10
// Ending 10
// Starting 10
// Starting 10
// Ending 10
// Ending 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);
}

正如@Yuriy提到的,这个答案有更多关于这种特殊性的信息:C#';s重用foreach中的变量?