繁体   English   中英

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

[英]Async Task with sync method call

我从新的.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
// ...

那是因为只有1个变量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#是否有理由在foreach中重用变量?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM