为了账号安全,请及时绑定邮箱和手机立即绑定

关于.net lock 关键字的用法,好处不太理解

关于.net lock 关键字的用法,好处不太理解

隔江千里 2018-12-07 06:44:15
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
查看完整描述

5 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

这里的lock锁定的是一个对象,不是文件,虽然你用的是一个FileInfo。

lock是互斥锁,当一个调用需要进入lock的代码的时候,必须是别的lock调用已经退出了。相当于洗手间的锁,一个洗手间只能同时一个人使用,进去一个人,就把洗手间门锁起来,别的人还想使用洗手间就只能排队了,当使用洗手间的人出来的时候,把锁打开,此时,排队使用洗手间的人中最前面的就可以使用了。

从你的要求来看,你想对文件进行锁处理,这个锁处理正常情况下,当你打开一个文件进行写的时候,文件系统会禁止该文件的再次打开,除非之前的打开写操作关闭了。此时,你可以在读的地方通过捕获异常来检测当前文件是否已经下载完成。

查看完整回答
反对 回复 2019-01-21
?
万千封印

TA贡献1891条经验 获得超3个赞

定義 類屬性 OBJECT O=new objec();

lock(0){

}這樣,不是你寫的那樣。

查看完整回答
反对 回复 2019-01-21
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我还是不理解

我想锁住一个文件 ,当并发访问这个文件的时候,排队访问

互不影响

查看完整回答
反对 回复 2019-01-21
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

@foxidea: 你不要鎖定this,要定義一個object。如果是this,效率 很低。如果要效率,可以參考其他的鎖定。lock 是最簡單的鎖定。

查看完整回答
反对 回复 2019-01-21
  • 5 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信