2016-06-23 2 views
0

У меня есть следующий псевдокод:Изменение каждого элемента в списке с нитями разных

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 // library/dd381779 (v = vs.110) .aspx) или синхронизация, когда вы изменяете небезопасную коллекцию. –

ответ

0

Используйте Parallel.ForEach();, чтобы изменить записи в вашем списке. Он будет управлять параллелизмом и потоками для вас.

Вы также можете break с помощью e.Break();

0

Текущий ответ (ов)/комментариев (ы) говорят что-то, что вам нужно для управления параллелизмом, поскольку вы изменяете записи в списке с помощью задач/нарезание резьбы. IMHO это неверно, так как модификации, которые выполняются на вашем объекте Data, являются точными - каждая задача изменяет только назначенный объект Data. В этом случае синхронизация не требуется.

С другой стороны, ваш метод ConsultarNoBanco выполняется из нескольких задач/потоков, в то же время. Поскольку вы не показываете код в методе, мы ничего не можем сказать об этом. Но мне кажется, что этот метод не является потокобезопасным. Тем более, что метод не принимает объект Data, и поэтому я могу предположить, что он делает что-то, не связанное с объектом Data.

Можете ли вы показать код метода ConsultarNoBanco? Это поточно-безопасный? Вы упомянули запрос, является ли обработчик запроса потоком?

Смежные вопросы