【问题标题】:How to read a text file from multiple thread c#如何从多线程c#中读取文本文件
【发布时间】:2013-07-08 21:26:58
【问题描述】:

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

我已经建立了一个参数列表,它将把“随机参数”排除在等式之外,并通过消除由于使用该随机参数而发生的冗余 API 调用来提高效率。

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

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

我对我应该看什么有点迷茫,任何建议和答案都将不胜感激!

【问题讨论】:

  • 您的意思是您实际上在您的应用程序中有 300 个线程?在不阅读其余问题的情况下,我可以立即说您做错了什么。要回答您的问题,您应该查看ConcurrentQueue
  • @LasseV.Karlsen 是的,就我每分钟能够扫描多少页而言,300 个线程恰好是最佳线程数。
  • @LasseV.Karlsen 这看起来正是我所需要的,唯一的问题是我是否会遇到将 800 万个 ulong 推入该队列的问题?
  • @Pi_ 如果元素数量少于 X,您应该只添加到队列中,否则请等待读取从队列中删除一些项目,然后再继续读取文件。
  • 不要直接使用ConcurrentQueue。使用BlockingCollection,它为ConcurrentQueue 提供了更有用的接口。

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


【解决方案1】:

第一种方式

    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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多