首页 新闻 会员 周边 捐助

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

0
[已解决问题] 解决于 2012-05-25 19:34
 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

fun5的主页 fun5 | 初学一级 | 园豆:4
提问于:2012-05-25 10:23
< >
分享
最佳答案
0

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

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

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

奖励园豆:5
无之无 | 大侠五级 |园豆:5095 | 2012-05-25 13:29

我当前写入文件,可能有其他进程访问此文件,

如果文件正在被写入,其他进程要处于等待状态,

当写入完成后,其他进程才能去读这个文件,而且要保证其他进程能够读到这个文件,

不知道怎么实现

fun5 | 园豆:4 (初学一级) | 2012-05-25 14:01

@foxidea: 写文件的时候设置独占模式,然后在读取模块,试着只读打开,假如文件写未完成(依然处在独占模式)则会抛出异常,此时捕获这个异常。

异常说明文件未写完成,需要继续等待。

lock(this)
{
    while(true)
    {
        try
        {
                //此处执行文件的打开操作
           break;//文件打开成功,说明下载那里已经完成,释放了独占模式的文件打开句柄(关闭了独占模式的文件打开方式)
        }
         catch(IOException)//有个IO异常,你自己确认下类型名
      {
            sleep(1000);//线程暂停一段时间,函数的调用你修正下,暂停时间(毫秒数)你调整下。
        }
    }
}

代码是我想象中写的,没在IDE中编写,更没调试运行。

无之无 | 园豆:5095 (大侠五级) | 2012-05-25 14:07

@笨笨蜗牛: 额,非常感谢

fun5 | 园豆:4 (初学一级) | 2012-05-25 19:35
其他回答(1)
0

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

lock(0){

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

無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-25 10:29

刚才测试了下,这样就可以了,但是这样 并发量会很差,我这个文件要求并发量很高

 

 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     }
支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-05-25 10:38

我还是不理解

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

互不影响

支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2012-05-25 10:45

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

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-25 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册