2016-06-23 2 views
0

と、リスト内の各要素を変更: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()が呼び出されるたびに変化します。スレッドセーフリストを使用して、コレクション内の各アイテムをマルチスレッドで変更する最も良い方法は何ですか?

+1

'Parallel.For'メソッドを使用してみてください。 – MaKCbIMKo

+0

あなたはスレッドを使用していません。スレッドを忘れる。 [スレッドがありません。](http://blog.stephencleary.com/2013/11/there-is-no-thread.html) – Maarten

+0

[ConcurrentBag](https://msdn.microsoft.com/en-us/) us // library/dd381779(v = vs.110).aspx)またはスレッドセーフでないコレクションを変更したときの同期。 –

答えて

0

Parallel.ForEach();を使用して、リストのエントリを変更してください。 これは、並行性とスレッド化を管理します。

することもできますbreak現在の回答(複数可)/コメント(s)は、タスク/スレッドを使用して、リスト内のエントリを変更しているので、あなたは同時実行を管理するために必要な何かを言っているのe.Break();

0

することもできます。あなたのDataオブジェクトで行われている変更がうまくいるので、これは間違っています - 各タスクは指定されたDataオブジェクトを変更するだけです。その時点では同期は必要ありません。

一方、ConsultarNoBancoのメソッドは、複数のタスク/スレッドから同時に実行されています。です。メソッドにコードを表示していないので、そのコードについては何も言えません。しかし、このメソッドはスレッドセーフではないという印象です。特にメソッドがDataオブジェクトを受け取っていないので、私はそれがDataオブジェクトに関連しない何かをしていると仮定することしかできません。

ConsultarNoBancoのコードを表示できますか?それはスレッドセーフですか?リクエストハンドラはスレッドセーフであると言いますか?

関連する問題