#c_sharp #потоки_данных #многопоточность
Всем привет, у меня есть список, и я в него с помощью потоков, создаваемых в цикле записываю значения. Ничего не записывается, я подозреваю, что из-за обращений к элементу типа List. Код: puplic class MyClass(){ Listlist = new List (); public MyClass(){ FillList(); } public void FillList(){ for(int i = 0; i < 50; i++) { new System.Threading.Thread(delegate() {Do(i);}).Start(); } } void Do(int i){ list.Add(i); } } Упрощенный пример, повторяет мою реализацию. Подозреваю нужно использовать Lock. Но могу разобраться, как правильно. Помогите, пожалуйста.
Ответы
Ответ 1
Вы не имеете права модифицировать список одновременно из различных потоков. Попробуйте так: Listlist = new List (); object mutex = new object(); for (int i = 0; i < 50; i++) new Thread(() => Do(i, mutex)).Start(); void Do(int i, object mutex) { // длинные вычисления lock(mutex) list.Add(i); } С другой стороны, зачем вам такие низкоуровневые конструкции? Есть гораздо более удобные высокоуровневые средства. Вы можете, например, использовать PLINQ: List list = Enumerable.Range(0, 50) .AsParallel() .AsOrdered() // если порядок важен .Select(Compute) .ToList(); int Compute(int i) { // длинные вычисления return i; } Обязательно почитайте: http://www.albahari.com/threading/ (там есть ссылка на русский перевод, но он, кажется, неполный).
Комментариев нет:
Отправить комментарий