等待ThreadPool完成

时间:2015-06-13 12:54:04

标签: c# multithreading threadpool streamwriter

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

即使有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行,最后一行不完整。

enter image description here

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

我认为线条是部分保存的,因为ThreadPool的线程需要一些时间来完成它们的工作。我对么?如果是这样,我怎么能实现呢?

1 个答案:

答案 0 :(得分:0)

Threadpool正在使后台线程执行在主线程中止时将停止中止的任务。您必须等待所有线程完成,然后刷新流。 由于您缺少最后几行,因此更可能只有Flush()问题,而不是中止线程。

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