我开发了一个应用程序,可以在磁盘上的.txt文件中保存10000行lorem。我使用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行,其中最后一个是不完整的。

如果我关闭程序,它会重新写入文件,添加所有的行,但最后一行是不完整的。为什么要这样?
我认为这些行的保存部分是因为线程的线程需要一些时间来完成它们的工作。我说的对吗?如果是这样的话,我怎样才能做到呢?
发布于 2015-06-13 13:01:25
线程池正在创建后台线程,以执行在主线程中止时将停止中止的任务。您必须等待所有线程完成,然后刷新流。由于您只遗漏了最后一行,所以更有可能的是,您在那里只发出了Flush()问题,而没有中止线程。
我相信您也知道,您的代码比在一个线程中完成工作更糟糕。在创建所有开销时,不存在真正的并行性。
https://stackoverflow.com/questions/30818902
复制相似问题