Всем привет, у меня есть список, и я в него с помощью потоков, создаваемых в цикле записываю значения. Ничего не записывается, я подозреваю, что из-за обращений к элементу типа List.
Код:
puplic class MyClass(){
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. Но могу разобраться, как правильно.
Помогите, пожалуйста.
Ответ
Вы не имеете права модифицировать список одновременно из различных потоков. Попробуйте так:
List
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
int Compute(int i)
{
// длинные вычисления
return i;
}
Обязательно почитайте: http://www.albahari.com/threading/ (там есть ссылка на русский перевод, но он, кажется, неполный).
Комментариев нет:
Отправить комментарий