2009-10-10 92 views
0

我正在编写的C#应用​​程序的一部分需要从服务提供者的数据库为与用户关联的每个帐户收集数据。当用户登录到应用程序时,会进行调用以开始更新服务提供商数据库中的帐户。由于许多操作都是在第三方的最后执行的,因此获取其信息的过程可能需要一段时间,所以我不想等待每个帐户开始更新过程。我的问题是,是否有任何问题(可能是线程问题)在循环内调用异步方法?循环内的回调(异步方法调用)

回答

5

唯一的循环特定的问题是,如果您使用引用循环变量的匿名方法,则每次在循环周围都会创建一个匿名方法对象的实例,但它们都将引用相同的循环变量,所以他们会看到它在循环执行时改变它的值。因此,在循环内创建一个循环变量的副本。

foreach (var thing in collection) 
{ 
    var copy = thing; 

    Action a =() => 
       { 
        // refer to copy, not thing 
       } 
} 

2017-04-25:顺便说一句,这个问题是由C#5.0解决的。 foreach自动执行上述转换。

1

循环没有问题,但也可能会启动(也)很多线程。看看你的要求是否允许使用the ThreadPool