等待线程池完成

Waiting for ThreadPool to finish

我开发了一个应用程序,可以在磁盘上的 .txt 文件中保存 10000 行 lorem ipsum。我使用 StreamWriter 实际编写这些行,并使用 ThreadPool 将计算过程分发到可用的 threads/cores.

保存速度非常快,即使有100万行,但问题是,并不是所有的行都保存了,最后一行保存了部分。当我关闭程序时,它出于某种原因再次写入文件。

我有以下字符串:

String loremipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

剩下的代码是:

    private StreamWriter writer = new StreamWriter("loremipsum.txt");
    private Object lockObject = new Object();

    // Button that initiates the process
    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= 10000; i++)
        {
            ThreadPool.QueueUserWorkItem(state =>
            {
                SaveFile(writer, loremipsum);
            });
        }
    }

    private void SaveFile(StreamWriter w, String text)
    {
        lock (lockObject)
        {
            w.WriteLine(text);
        }
    }

由于 StreamWriter 不是线程安全的,因此我使用了锁定对象。

如果我用我的程序 运行 打开我的 .txt 文件,它只有 9998 行,最后一行不完整。

如果我关闭程序,它会再次重写到文件,添加所有行,但最后一行还是不完整。这是为什么?

我想这些行被部分保存了,因为 ThreadPool 的线程需要一些时间来完成它们的工作。我对么?如果可以,我该如何实现?

线程池正在让后台线程执行任务,如果主线程被中止,这些任务将被中止。您必须等待所有线程完成,然后刷新流。 由于您只缺少最后几行,因此您更有可能在那里只有 Flush() 问题,而不是中止的线程。

我相信你也知道你的代码比在单线程中完成工作更糟糕。在创建所有开销时,那里没有真正的并行性发生。