と、リスト内の各要素を変更:Iは、次の擬似コードを有する貴様スレッド
public void Associar(List<Data> dados)
{
List<Task> tasks = new List<Task>();
foreach(dado in dados)
{
tasks.Add(AdicionarAsync(dado));
}
Task.WaitAll(tasks.ToArray());
Debug.WriteLine(dados.Select(e => e.Colecao).Sum(e => e.Count));
}
public async Task<List<Foo>> ConsultarNoBanco()
{
//make request
//here the result is OK
return result;
}
public async Task AdicionarAsync(Data dado)
{
dado.Colecao = await ConsultarNoBanco();
//Here the result (dado.Colecao) is wrong
//If I modify the code to ConsultarNoBanco().Result everything works fine
}
このコードの出力は常に411でなければならないが、結果は、メソッドAssociar()
が呼び出されるたびに変化します。スレッドセーフリストを使用して、コレクション内の各アイテムをマルチスレッドで変更する最も良い方法は何ですか?
'Parallel.For'メソッドを使用してみてください。 – MaKCbIMKo
あなたはスレッドを使用していません。スレッドを忘れる。 [スレッドがありません。](http://blog.stephencleary.com/2013/11/there-is-no-thread.html) – Maarten
[ConcurrentBag](https://msdn.microsoft.com/en-us/) us // library/dd381779(v = vs.110).aspx)またはスレッドセーフでないコレクションを変更したときの同期。 –