繁体   English   中英

StreamWriter多线程C#

[英]StreamWriter Multi Threading C#

我想请求帮助我的代码。 我是一个新手,想要在写入文本文件时实现安全的多线程。

    StreamWriter sw = new StreamWriter(@"C:\DailyLog.txt");
    private void Update(){
        var collection = Database.GetCollection<Entity>("products");
        StreamReader sr = new StreamReader(@"C:\LUSTK.txt");
            string[] line = sr.ReadLine().Split(new char[] { ';' });
            while (!sr.EndOfStream)
            {
                    line = sr.ReadLine().Split(new char[] { ';' });
                    t = delegate { 
                           UpdateEach(Convert.ToInt32(line[5])); 
                        }; 
                     new Thread(t).Start();
            }
            sr.Close();

    }
    private void UpdateEach(int stock)
    {
            sw.WriteLine(ean);

    }

我的代码没有错误,但似乎并没有写入我的文本文件。 我没有制作sw.Close()因为我知道有些线程尚未完成。 另外,我怎么能实现sw.Close知道没有线程离开unfinish。 我的LUSTK.text中有5个记录,由StreamReader读取,每个记录创建一个线程,每个线程访问相同的文本文件。

您无法同时从不同的线程写入同一个编写器。 该对象不是为支持并发访问而设计的。

除此之外,从多个线程写入同一文件的一般想法是有缺陷的。 你仍然只有一个物理磁盘,它只能旋转得那么快。 告诉它更快地做事情不会让它更快地旋转。

除此之外,正如你所说,你没有关闭编写器,因此缓冲区没有被刷新。

你也可以在你的匿名方法是关闭了一个bug line ,所有的方法都关在同一个变量,它正在改变。 重要的是,每个人都要关闭自己不会改变的标识符。 (这可以通过声明简单地完成line内侧 while循环。)但是因为你不应该使用多线程,首先,有没有真正的需要重点关注这一点。

您还可以使用File.ReadLinesFile.WriteAllLines来执行文件IO; 它导致更清晰的代码:

var values = File.ReadLines(inputFile)
    .Select(line => line.Split(';')[5]);
File.WriteAllLines(outputFile, values);

如果你想要并行化这个过程,那将是因为你在读完行之后和写行之前对每个项目进行了一些CPU绑定工作。 如前所述,并行化实际文件IO可能是有害的,没有帮助。 在这种情况下,CPU绑定工作只是拆分线并获取一个值,与文件IO相比,这可能会非常快。 例如,如果您需要访问数据库或在每一行上执行一些昂贵的处理,那么您可以考虑并行化这部分工作,同时通过单个线程同步文件IO。

StreamWriter根本不是线程安全的; 您需要通过lock或类似方式同步对此的访问。 但是,我建议一般重新考虑你的策略:

  • 开始大量的线程是一个非常糟糕的主意 - 线程实际上相当昂贵,并且不应该用于小工作项目(虽然TaskThreadPool可能没问题) - 可能从线程中单独出列的线程数量较少 - 安全队列会更好
  • 在输出方面,您无法保证订单
  • 坦率地说,我希望IO在这里是你最大的性能问题,并且不会受到线程数量的影响(或者更糟糕的是:可能受到不利影响)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM