以下代码如何自动线程安全?

时间:2015-09-05 11:59:08

标签: c# multithreading task

我有以下代码,两个线程在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完全对齐。但我期待这份名单混合或改组。为什么这两个任务不是以随机方式添加新元素,而是完全排序?

1 个答案:

答案 0 :(得分:3)

您的任务绝对不是线程安全的,因为它们同时写入同一个列表。您获得结果的最可能原因是第一个任务很快完成 - 它在第二个任务有机会开始之前完成所有999个对象的编写。

如果在执行任务时添加随机短暂延迟,您会看到结果的一些随机性。让你的任务做更多工作也可能会增加一些随机性:例如,如果你将列表设为StAXSource并构建你的字符串,第二个任务可能会在第一个完成之前开始。