У меня есть следующий код, который два потока добавляет новые элементы в список.Как следующий код автоматически защищен потоком?
public class Numbers
{
public int number;
public string threadName;
}
static void Main(string[] args)
{
List<Numbers> numbers = new List<Numbers>();
Task t = Task.Factory.StartNew(() => {
for (int i = 0; i < 999; i++)
{
numbers.Add(new Numbers() { number = i, threadName = "t" });
}
});
Task k = Task.Factory.StartNew(() =>
{
for (int i = 0; i < 999; i++)
{
numbers.Add(new Numbers() { number = i, threadName = "k" });
}
});
t.Wait();
k.Wait();
StreamWriter writer = new StreamWriter("text.txt");
foreach (var item in numbers)
{
writer.WriteLine(item.threadName + item.number);
}
writer.Flush();
Console.WriteLine("Done!");
Console.ReadLine();
}
Когда я открываю текстовый файл, я вижу их идеально выровнены с k0k1 ... k999t0t1 ... t999. Но я ожидал, что список будет смешанным или перетасованным. Почему эти две задачи не добавляют новые элементы случайным образом, но вместо этого они сортируются отлично?
Возможно, потому что ваши задачи заканчиваются _very_ быстро, а первый заканчивается до того, как второй настроен? Не то, что 'List' в любом случае не является потокобезопасным, поэтому, как только вы выполняете обе задачи, выполняемые по-настоящему параллельными, вы получите исключения, которые выбраны из 'Add()'. –
CodeCaster
@CodeCaster Вы всегда правы. Я добавил немного потока сна после добавления элемента и да, они непредсказуемы. – ozgur