首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待ThreadPool完成

等待ThreadPool完成
EN

Stack Overflow用户
提问于 2015-06-13 12:54:03
回答 1查看 648关注 0票数 0

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

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

我有以下字符串:

代码语言:javascript
复制
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.";

其余的代码是:

代码语言:javascript
复制
    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行,其中最后一个是不完整的。

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

我认为这些行的保存部分是因为线程的线程需要一些时间来完成它们的工作。我说的对吗?如果是这样的话,我怎样才能做到呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 13:01:25

线程池正在创建后台线程,以执行在主线程中止时将停止中止的任务。您必须等待所有线程完成,然后刷新流。由于您只遗漏了最后一行,所以更有可能的是,您在那里只发出了Flush()问题,而没有中止线程。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30818902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档