C# 在使用Task.WhenAll的情况下是否需要ConcurrentQueue?

C# 在使用Task.WhenAll的情况下是否需要ConcurrentQueue?,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我正在异步读取4个XML文件,并希望将结果合并到一个结果文件中。我正在使用ConcurrentQueue,但我不确定是否需要 是我正在向Task.Whalll中的单个集合添加的事实可能会导致并发问题吗?ConcurrentQueue是解决此问题的唯一方法吗 数据文件示例1/4 <?xml version="1.0" encoding="utf-8" ?> <states> <state id="11"

我正在异步读取4个XML文件,并希望将结果合并到一个结果文件中。我正在使用ConcurrentQueue,但我不确定是否需要

是我正在向Task.Whalll中的单个集合添加的事实可能会导致并发问题吗?ConcurrentQueue是解决此问题的唯一方法吗

数据文件示例1/4

<?xml version="1.0" encoding="utf-8" ?>
<states>
  <state id="11" Name="Georgia" Abbrev="GA" Capital="Atlanta" region="" />
  <state id="12" Name="Alabama" Abbrev="AL" Capital="Montgomery" region="" />
  <state id="13" Name="Mississippi" Abbrev="MS" Capital="Jackson" region="" />
  <state id="14" Name="Arkansas" Abbrev="AK" Capital="Little Rock" region="" />
  <state id="15" Name="South Carolina" Abbrev="SC" Capital="Columbia" region="" />
</states>
代码


您根本不需要更改并发任务中的共享状态。相反,只需返回数据,并在所有任务运行后在主线程中聚合数据。乙二醇

var states = await Task.WhenAll(_regions.Select(async region =>
{
    var r = await GetLocationServices(region);
    var state = DeserializeResponse<State>(r);
    return state;
}));

foreach (var s in states) ...

我正在使用ConcurrentQueue,但我不确定是否需要-我不理解您的问题。为什么不需要ConcurrentQueue?控制台程序的默认同步上下文意味着添加元素的延续可以发生在任何线程池线程中,因此您当然有可能进行并发访问。你不需要ConcurrentQueue,但你需要一些东西。你的帖子根本不清楚你到底需要什么样的帮助。请更好地解释这个问题。如果说,数据文件没有指定区域属性怎么办?我可以在反序列化过程中和Task.whalll中循环状态并安全地分配区域而不发生冲突。也许是从文件名中得到了这个区域,我不太明白。但基本模式是,异步代码只写入本地对象,并返回它们以由Task.WhenAll.收集。在反序列化语句之后和返回状态之前,我是否可以在其中放入一个循环,并更新在结果数组变量中指定区域属性的所有行称为state?有点像我在OP里排队。相反,我只更新region属性。当然。只要修改在本地作用域中创建的对象,它是安全的。@是的,ConcurrentQueue会正常工作。但大卫·布朗建议的技术更为优越。共享状态越少越好。
var states = await Task.WhenAll(_regions.Select(async region =>
{
    var r = await GetLocationServices(region);
    var state = DeserializeResponse<State>(r);
    return state;
}));

foreach (var s in states) ...