1 string cacheFilePath = "D:\test.html"; 2 string url = "http://www.baidu.com/"; 3 4 FileInfo cacheFileInfo = new FileInfo(cacheFilePath); 5 6 lock (cacheFileInfo) 7 { 8 9 10 WebClient wc = new WebClient(); 11 byte[] pageData = wc.DownloadData(url); 12 FileStream cacheFileStream; 13 cacheFileStream = cacheFileInfo.Create(); 14 cacheFileStream.Write(pageData, 0, pageData.Length); 15 cacheFileStream.Close(); 16 cacheFileStream.Dispose(); 17 18 context.Response.TransmitFile(cacheFilePath); 19 20 }
我用了lock (cacheFileInfo)
是不是其它进程访问 cacheFilePath = "D:\test.html"; 这个文件的时候,会排队?
因为 我使用了 WebClient wc = new WebClient(); 下载一个网页html,然后保存 ,当没保存完的时候,可能会有进程去访问这个文件,为了避免在这个过程中出现错误,我用了lock
但是我发现还是有错误,可能我用错了 lock
这里的lock锁定的是一个对象,不是文件,虽然你用的是一个FileInfo。
lock是互斥锁,当一个调用需要进入lock的代码的时候,必须是别的lock调用已经退出了。相当于洗手间的锁,一个洗手间只能同时一个人使用,进去一个人,就把洗手间门锁起来,别的人还想使用洗手间就只能排队了,当使用洗手间的人出来的时候,把锁打开,此时,排队使用洗手间的人中最前面的就可以使用了。
从你的要求来看,你想对文件进行锁处理,这个锁处理正常情况下,当你打开一个文件进行写的时候,文件系统会禁止该文件的再次打开,除非之前的打开写操作关闭了。此时,你可以在读的地方通过捕获异常来检测当前文件是否已经下载完成。
我当前写入文件,可能有其他进程访问此文件,
如果文件正在被写入,其他进程要处于等待状态,
当写入完成后,其他进程才能去读这个文件,而且要保证其他进程能够读到这个文件,
不知道怎么实现
@foxidea: 写文件的时候设置独占模式,然后在读取模块,试着只读打开,假如文件写未完成(依然处在独占模式)则会抛出异常,此时捕获这个异常。
异常说明文件未写完成,需要继续等待。
lock(this) { while(true) { try { //此处执行文件的打开操作 break;//文件打开成功,说明下载那里已经完成,释放了独占模式的文件打开句柄(关闭了独占模式的文件打开方式) } catch(IOException)//有个IO异常,你自己确认下类型名 { sleep(1000);//线程暂停一段时间,函数的调用你修正下,暂停时间(毫秒数)你调整下。 } } }
代码是我想象中写的,没在IDE中编写,更没调试运行。
@笨笨蜗牛: 额,非常感谢
定義 類屬性 OBJECT O=new objec();
lock(0){
}這樣,不是你寫的那樣。
刚才测试了下,这样就可以了,但是这样 并发量会很差,我这个文件要求并发量很高
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 new Program().RunThread(); 7 Console.WriteLine("ok"); 8 Console.Read(); 9 10 } 11 12 public void RunThread() 13 { 14 for (int i = 0; i < 10; i++) 15 { 16 Thread t = new Thread(Execute); 17 t.IsBackground = true; 18 t.Start(i); 19 20 } 21 } 22 23 public void Execute(object o) 24 { 25 26 //FileInfo fi = new FileInfo("test.html"); 27 lock (this) 28 { 29 WebClient wc = new WebClient(); 30 wc.DownloadFile("http://www.baidu.com/", "test.html"); 31 wc.Dispose(); 32 Console.WriteLine(o.ToString()); 33 } 34 } 35 }
我还是不理解
我想锁住一个文件 ,当并发访问这个文件的时候,排队访问
互不影响
@foxidea: 你不要鎖定this,要定義一個object。如果是this,效率 很低。如果要效率,可以參考其他的鎖定。lock 是最簡單的鎖定。