如何从多个线程c#中读取文本文件

时间:2013-07-08 21:26:59

标签: c# multithreading file-io concurrency thread-safety

我有一个使用多个线程(300)来查询API的程序。目前它表现为爬虫,每个线程根据刚刚处理的API调用结果和随机参数确定其下一个Web API调用。

我已经构建了一个参数列表,它将“随机参数”从等式中取出,并通过消除由于使用该随机参数而发生的冗余API调用,使其更有效。

该列表采用大约800万行的文本文件形式。

理想情况下,我想拥有的是我的主线程中的流读取器对象,该对象是线程安全的,并且只要处理完最后一个线程,所有(300)个其他线程将使用文本文件中的“getLine”一直到文件耗尽。

对于我应该关注的内容,我有点迷茫,任何建议和答案都将不胜感激!

1 个答案:

答案 0 :(得分:0)

第一种方式

    public static string GetLineThreadSafe(this StreamReader sr)
    {
        lock (sr)
        {
            return sr.EndOfStream ? null : sr.ReadLine();
        }
    }

第二种方式

    public static IEnumerable<string> GetEnumirator(this StreamReader sr)
    {
        while (!sr.EndOfStream)
        {
            yield return sr.ReadLine();
        }
    }

    public static void ProcessParalel(this StreamReader sr, Action<string> action, int threadsCount)
    {
        ParallelOptions po = new ParallelOptions();
        po.MaxDegreeOfParallelism = threadsCount;
        Parallel.ForEach(sr.GetEnumirator(), po, action);
    }