标签:c file multithreading 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知道没有线程离开unfinish.我的LUSTK.text中有5个记录,由StreamReader读取,每个记录创建一个线程,每个线程访问相同的文本文件.
解决方法:
您无法同时从不同的线程写入同一个编写器.该对象不是为支持并发访问而设计的.
除此之外,从多个线程写入同一文件的一般想法是有缺陷的.你仍然只有一个物理磁盘,它只能旋转得那么快.告诉它更快地做事情不会让它更快地旋转.
除此之外,正如你所说,你没有关闭编写器,因此缓冲区没有被刷新.
您还有一个错误,即您的匿名方法正在关闭,并且所有方法都在关闭同一个变量.重要的是,每个人都要关闭自己不会改变的标识符. (这可以通过在while循环中声明行来完成.)但是由于你不应该开始使用多个线程,所以没有必要专注于此.
您还可以使用File.ReadLines和File.WriteAllLines来执行文件IO;它导致更清晰的代码:
var values = File.ReadLines(inputFile)
.Select(line => line.Split(';')[5]);
File.WriteAllLines(outputFile, values);
如果你想要并行化这个过程,那将是因为你在读完行之后和写行之前对每个项目进行了一些CPU绑定工作.如前所述,并行化实际文件IO可能是有害的,没有帮助.在这种情况下,CPU绑定工作只是拆分线并获取一个值,与文件IO相比,这可能会非常快.例如,如果您需要访问数据库或在每一行上执行一些昂贵的处理,那么您可以考虑并行化这部分工作,同时通过单个线程同步文件IO.
标签:c,file,multithreading,streamreader,streamwriter 来源: https://codeday.me/bug/20190716/1478230.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。