Un-Threaded比线程更快

Yoa*_*oav 1 c# performance multithreading

我有一个应用程序需要.CSV在应用程序启动时读取非常大的文件并将每行转换为object.这些是读取文件的方法:

public List<Aobject> GetAobject()
    {
        List<Aobject> Aobjects = new List<Aobject>();

        using (StreamReader sr = new StreamReader(pathA, Encoding.GetEncoding("Windows-1255")))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] spl = line.Split(',');
                Aobject p = new Aobject { Aprop = spl[0].Trim(), Bprop = spl[1].Trim(), Cprop = spl[2].Trim() };
                Aobjects.Add(p);
            }
        }

        return Aobjects;
    }

    public List<Bobject> GetBobject()
    {
        List<Bobject> Bobjects = new List<Bobject>();

        using (StreamReader sr =
           new StreamReader(pathB, Encoding.GetEncoding("Windows-1255")))
        {
            //parts.Clear();
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] spl = line.Split(',');
                Bobject p = new Bobject();
                p.Cat = spl[0];
                p.Name = spl[1];
                p.Serial1 = spl[3].ToUpper().Contains("1");
                if (spl[4].StartsWith("1"))
                    p.Technical = 1;
                else if (spl[4].StartsWith("2"))
                    p.Technical = 2;
                else
                    p.Technical = 0;
                Bobjects.Add(p);
            }
        }

        return Bobjects;
    }
Run Code Online (Sandbox Code Playgroud)

这阻止了我UI几秒钟,所以我试着去做multi-Threaded.但是我的所有测试都表明un-threaded情景更快.这是我测试它的方式:

 Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int i = 0; i < 1000; i++)
            {
                Dal dal = new Dal();
                Thread a = new Thread(() => { ThreadedAobjects = dal.GetAobject(); });
                Thread b = new Thread(() => { ThreadedBobjects = dal.GetBobject(); });

                a.Start();
                b.Start();

                b.Join();
                a.Join();
            }
            sw.Stop();

            txtThreaded.Text = sw.Elapsed.ToString();

            Stopwatch sw2 = new Stopwatch();
            sw2.Start();

            for (int i = 0; i < 1000; i++)
            {
                Dal dal2 = new Dal();
                NonThreadedAobjects = dal2.GetAobject();
                NonThreadedBobjects = dal2.GetBobject();
            }
            sw2.Stop();

            txtUnThreaded.Text = sw2.Elapsed.ToString();
Run Code Online (Sandbox Code Playgroud)

结果:
线程运行:00:01:55.1378686
UnTreaded运行:已00:01:37.1197840
编译.Net4.0.Net3.5在发布模式下也应运行.
有些人可以解释为什么会发生这种情况,我该如何改进呢?

Slu*_*art 5

您忽略了与创建和启动线程相关的成本.而不是创建新线程尝试使用线程池:

ThreadPool.QueueUserWorkItem(() => { ThreadedAobjects = dal.GetAobject(); });
Run Code Online (Sandbox Code Playgroud)

您还需要计算已完成的操作数量,以便正确计算总时间.看看这个链接:http://msdn.microsoft.com/en-us/library/3dasc8as.aspx