c# - StreamWriter 多线程 C#

标签 c# multithreading file streamreader streamwriter

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

    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。我的 LUSTK.text 中有 500 万条记录,将由 StreamReader 读取,每个记录都创建了一个线程,每个线程访问相同的文本文件。

最佳答案

您将无法从不同的线程同时写入同一作者。该对象未设计为支持并发访问。

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

除此之外,您并没有像您所说的那样关闭编写器,因此缓冲区没有被刷新。

您还有一个错误,即您的匿名方法正在关闭 line,并且所有方法都在同一变量上关闭,该变量正在发生变化。重要的是,他们每个人都关闭自己不会改变的标识符。 (这可以简单地通过在 while 循环中声明 line inside 来完成。)但是因为你不应该使用多线程开始, 没有真正需要关注这一点。

您还可以使用 File.ReadLinesFile.WriteAllLines 来执行文件 IO;它会产生更简洁的代码:

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

如果您想要并行化此过程,那是因为您在读取该行之后和写入该行之前对每个项目执行了一些 CPU 密集型工作。如前所述,并行化实际文件 IO 可能有害无益。在这种情况下,受 CPU 限制的工作只是拆分行并获取一个值,与文件 IO 相比,这可能快得惊人。例如,如果您需要访问数据库或在每一行上执行一些昂贵的处理,那么您可以考虑并行化只是这部分的工作,同时通过单个线程同步文件 IO。

关于c# - StreamWriter 多线程 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19304209/

相关文章:

c# - SqlDataAdapter.Fill 和 SqlDataReader.Read 的结果不一致

c# - WPF DataGridTemplateColumn 设置可见性与绑定(bind)未触发

c# - 捕获表单外的鼠标/键盘事件(在后台运行的应用程序)

c++ - 高效地分配许多短命的小对象

c# - 我的第一个非重复字符算法的缺陷在哪里?

java - 删除在循环Java中的arraylist中创建的对象

android - 将相同的循环程序与不同的线程相关联

file - **在Gradle Copy任务中意味着什么

C:将数据值读入结构

java - 为每个平台获取正确的斜杠