是否需要将异步方法结果循环聚合到线程安全的集合中?

时间:2018-06-01 23:59:49

标签: c# .net multithreading async-await thread-safety

让我说我有一个场景,我已经创建了一些循环逻辑,并且在循环中,我将结果聚合到外部列表中。我知道在这种情况下,Parallel.ForEach()的结果需要放在一个线程安全的集合中,如ConcurrentBag而不是List。对于从异步方法返回的结果,这种做法也是如此吗?或者将异步方法循环的结果聚合到标准List中是否安全?

更新

有趣的测试:我运行了一个测试,我只是将1M Tuple添加到ConcurrentBag并对List进行相同的测试。 List测试在480ms完成,而ConcurrentBag测试在777完成。因此List比使用1M插入的ConcurrentBag快近40%。我尝试了250K行的相同测试,ConcurrentBag测试在140完成,而List测试在182完成。因此,对于250K插入,ConcurrentBag快了近25%。如果插入场景可以作为AddRange()完成,那么List很可能会更快,但是如果需要针对结果集逐步完成插入,则ConcurrentBag更快。 250K。这也是你的经历吗?知道为什么ConcurrentBag对于较小的结果集而言比List更快,但对于较大的结果集则相对较慢?

0 个答案:

没有答案