Задать вопрос
@martensit

C# В чем может быть причина неправильной работы временной задержки в многопотоке?

Есть такой простой Сниппет:

var listt = new List<string>();
System.Threading.Tasks.Parallel.For(0, 30, p => {
	System.Threading.Thread.Sleep(p*500);
	lock(SyncObjects.ListSyncer)
	{
		listt.Add(p.ToString());
	}
});
File.WriteAllLines(@"C:\zzz.txt", listt);


По логике на выходе мы должны видеть последовательность: 0,1,2,3...28,29
А сам скрипт по времени должен занимать 15 секунд.
Но на выходе мы получаем последовательность этих чисел вперемешку.
Где засада?
  • Вопрос задан
  • 167 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Скрип будет выполняться дольше, у вас спит от в зависимости от итерации.
А итераций 30. В разнобой потому что итерации запускаются не последовательно.
Прогоните вот этот скрипт в LinqPad:

var listt = new List<string>();
System.Threading.Tasks.Parallel.For(0, 30, (iter,state) => {
  System.Threading.Thread.Sleep(iter*500);
  iter.Dump("Iter");
  lock(ListSyncer)
  {
    listt.Add(iter.ToString());
  }
});


P.S. А потом там же прогоните вот это:

static readonly object ListSyncer = new object();

IEnumerable<int> Range(int fromInclusive, int toExclusive)
{
  for (var i = fromInclusive; i < toExclusive; i++) yield return i;
}

void Main()
{
	var listt = new List<string>();
	var range = Range(0, 30);
System.Threading.Tasks.Parallel.ForEach(range, (iter,state) => {
  System.Threading.Thread.Sleep(iter*500);
  iter.Dump("Iter");
  lock(listt) {
  listt.Add(iter.ToString());
  }
});

listt.Dump();

}

// Define other methods and classes here
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы