使用线程从文件中获取电子邮件

时间:2015-03-15 09:21:51

标签: c# multithreading

我有一个应用程序,它可以读取文件并从中获取电子邮件。我使用线程运行我的应用程序,但我的应用程序在性能方面没有变得更好......我的问题是什么?

使用线程(需要54秒):

StreamReader sr = new StreamReader(@"D:\15.txt");

Regex regx = new Regex(@"([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))");
while (!sr.EndOfStream)
{
    var line = sr.ReadLine();

    Thread th = new Thread(new ThreadStart(() => {
        var mc = regx.Matches(line);

        if (mc.Count != 0)
            foreach (Match item in mc)
            {
                Console.WriteLine(item.Value);
            }
    }));

    th.Start();
}

普通代码(需要54秒):

StreamReader sr = new StreamReader(@"D:\15.txt");

Regex regx = new Regex(@"([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))");
while (!sr.EndOfStream)
{
    var line = sr.ReadLine();

    var mc = regx.Matches(line);

    if (mc.Count != 0)
        foreach (Match item in mc)
        {
            Console.WriteLine(item.Value);
        }
}

2 个答案:

答案 0 :(得分:0)

单独使用线程不会使您的应用程序更快。在这种情况下,在初始情况下,您有一个线程完成所有工作。在下一种情况下,你有第一个线程启动一个线程来完成工作。但是,您仍然只有一个线程处理,并且您的初始线程在等待处理准备就绪。如果你想让它更快,你需要找到你可以并行的部分。

答案 1 :(得分:0)

创建和启动线程是一项代价高昂的操作。每个RegEx有一个可能不符合成本效益。调用RegEx是便宜的,以保证额外的线程。

您的磁盘读取时间可能会花费更多时间,因此线程可能的任何好处都会消失。