none
使用ReaderWriterLockSlim类的疑问 RRS feed

  • 问题

  • 程序中启动了两个线程A和B,执行线程方法method()去改写文件fileTXT, 为了避免竞争,使用了ReaderWriterLockSlim类,代码如下:
    ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
    
            bool method(string fileTXT)//线程方法
            {
                if (cacheLock.TryEnterWriteLock(1000))
                {
                    try
                    {
                        OverWrite(fileTXT);//改写文件fileP的方法
                    }
                    finally
                    {
                        cacheLock.ExitWriteLock();
                    }
                    return true;
                }
                else
                    return false;
            }
    
    
    
    

    当两个线程操作的是同一个文件时,没什么问题。但是如果两个线程操作的是不同的文件时,就有下面的疑问:
    从代码中可以看出,cacheLock是和哪个文件无关的,那么当线程A获得了锁,并操作文件fileP1时,线程B由于获得不了锁,而无法操作文件,即使准备操作的文件是另外一个文件fileP2,也不行!这显然是不合理的。
    我对问题出在哪儿呢?谢谢指教!
    2011年9月23日 9:37

答案

  • 这有一个方法检测一个文件是否在使用:

    如下:

     

            protected  bool IsFileLocked(string  fileTXT)
            {
                FileStream stream = null;
    
                try
                {
                    FileInfo file = new FileInfo(fileTXT);
                    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                }
                catch (IOException)
                {
                    return true;
                }
                finally
                {
                    if (stream != null)
                        stream.Close();
                }
                return false;
            } 
    
    

    您可以在加锁之前先判断该文件是否在使用,如果在使用呢,就加锁,如果没有,就直接操作。

    希望对您有用。


    Best Regards,
    Rocky Yue[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 JSHZP 2011年9月29日 11:17
    2011年9月26日 6:30
    版主