我有以下代码,两个线程在List中添加新元素。
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完全对齐。但我期待这份名单混合或改组。为什么这两个任务不是以随机方式添加新元素,而是完全排序?
答案 0 :(得分:3)
您的任务绝对不是线程安全的,因为它们同时写入同一个列表。您获得结果的最可能原因是第一个任务很快完成 - 它在第二个任务有机会开始之前完成所有999个对象的编写。
如果在执行任务时添加随机短暂延迟,您会看到结果的一些随机性。让你的任务做更多工作也可能会增加一些随机性:例如,如果你将列表设为StAXSource
并构建你的字符串,第二个任务可能会在第一个完成之前开始。