我正在编写的C#应用程序的一部分需要从服务提供商的数据库中为与用户关联的每个帐户收集数据。当用户登录应用程序时,将进行调用以开始从服务提供商的数据库更新帐户。由于在第三方结束时执行批量操作,获取其信息的过程可能需要一段时间,因此我不想等待每个帐户只是为了开始更新过程。我的问题是,在循环中调用异步方法是否有任何问题(可能是线程问题)?
答案 0 :(得分:5)
唯一特定于循环的问题是,如果你使用引用循环变量的匿名方法,每次循环时都会创建一个匿名方法对象的实例,但它们都会引用相同的循环变量,所以它们都是会看到它在循环执行时改变它的值。所以在循环中复制循环变量。
foreach (var thing in collection)
{
var copy = thing;
Action a = () =>
{
// refer to copy, not thing
}
}
2017-04-25:顺便说一下,这个问题已经被C#5.0解决了。 foreach
会自动执行上述转换。
答案 1 :(得分:1)
循环没问题,但启动(太多)线程可能是。查看您的要求是否允许使用the ThreadPool。