configureView()
cOrders最终没有收到API发回的所有回复。如果我将它更改为一个简单的For循环,一切都很好,但它需要很长时间,因为对于某些调用,有许多循环返回API以获取我需要的所有数据。
答案 0 :(得分:1)
您正在循环中重用请求对象。这将无法工作,因为多个线程将访问和修改此单个实例。 您必须同步/锁定对请求'实例的访问(然后您有一个没有并行化的正常for循环)或为循环内的每个请求创建一个自己的请求对象...
答案 1 :(得分:1)
列表不是线程安全的。框架中的大多数类型都不是。在多线程上下文中使用一个时,请确保check the docs。
此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的。任何实例成员都不保证是线程安全的。 在List上执行多个读取操作是安全的,但如果在读取集合时修改了集合,则可能会出现问题。要确保线程安全,请在读取或写入操作期间锁定集合。要使多个线程可以访问集合以进行读写,您必须实现自己的同步。对于具有内置同步的集合,请参阅System.Collections.Concurrent命名空间中的类。有关本质上线程安全的替代方法,请参阅ImmutableList类。
我真正挖掘了不可变的集合,并且在大多数情况下更喜欢它们而不是并发集合。不幸的是,对于新用户来说,它们更难以使用和理解。任何突变都会导致新集合,然后您必须使用它来替换旧版本。这本身并不是安全的类型,但它们附带了一个工具,可以为您完成所有这些工作。
var foo = ImmutableList<string>.Empty;
ImmutableInterlocked.Update(ref foo, list => list.Add("woot"));
list.Add("woot")
返回基于foo
的新列表,ImmutableInterlocked.Update
将尝试更新foo
,直到确定集合引用已正确更新为止。您可以替换重做工作(list.Add("woot")
)进行锁定。