日期:2014-05-17  浏览次数:21001 次

多线程写文件的问题
java中可以多线程对同一个文件进行写操作,但c#我试了后报异常,不知c#是不是不支持多线程写同一个文件。
我的应用场景是 我想做一个多线程下载器,每个线程下载一部分,然后写入本地文件
比如一个文件有1024 bytes,开2个线程下,保存到文件a.txt中
线程1下载从 0-512, 下载完后从文件位置0处开始写入
线程2下载从 513-1023,下载完后从文件位置513处开始写入 

我用java实现了,但c#就不行 多线程不能同时写一个文件,望高手指教
c# 多线程

------解决方案--------------------
引用:
java中可以多线程对同一个文件进行写操作,但c#我试了后报异常,不知c#是不是不支持多线程写同一个文件。
我的应用场景是 我想做一个多线程下载器,每个线程下载一部分,然后写入本地文件
比如一个文件有1024 bytes,开2个线程下,保存到文件a.txt中
线程1下载从 0-512, 下载完后从文件位置0处开始写入
线程2下载从 513-1023,下载完后从文件位置513处开始写入 

我用java实现了,但c#就不行 多线程不能同时写一个文件,望高手指教

第一个写完记得把文件流close掉。
------解决方案--------------------
FileStream fs = new FileStream(LogFile, FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
------解决方案--------------------
引用:
这里更正一下,描述改成
比如一个文件有1024 M,开2个线程下,保存到文件a.avi中,每下载1k就写入文件(而不是每个线程自己下载完才写入文件)
线程1下载从 0-512M, 从文件位置0处开始写入
线程2下载从 512M 1 byte-1023M,从文件位置512M 1 byte处开始写入 

你可以让线程1写1k,退出,然后线程2去再写1k。

其实你的设计就有问题,只你的下载速度大于磁盘写入速度非常多,才会需要很大的内存缓存,这貌似很难发生。多线程同时写磁盘并不能提升磁盘写入的速度,而且这个磁盘写入速度相对于下载速度来说应该还是很快的。
至于到底要怎么做,你再好好想想吧。
至于java,没研究过,也许你应该看看java的源代码,看看java多线程写磁盘的时候到底发生了什么,是不是和你想的一样。
------解决方案--------------------
可尝试设置FileShare.Write
也可以设计成
多线程下载到缓冲区
专门弄一个读线程读缓冲区数据,另一个写线程将数据写入文件
------解决方案--------------------
其实,如果你用.Net封装好的Begin-End Write就不用自己去管理线程了