2009-03-24

ReaderWriterLock

最近在撰寫Web Service程式的時候,遇到一個問題,
就是在Web Service程式碼中雖然有用Try...Catch保護
但是卻沒將錯誤資訊記錄下來
所以導致在Server端發生錯誤,但卻感覺什麼事情都沒發生的情況

想到的解決方法是
1.將錯誤寫一個Txt檔案。
2.將錯誤寫進Event View裡。

我選擇第一個方式寫一個Txt檔案
我不曉得是否會發生程式同時寫入同一個檔案的問題
想到之前有聽到這個類別
ReaderWriterLock
一直沒有去實際嘗試看看,所以趁這個機會來嘗試一下

首先我建立了兩個Thread
Thread myThread1 = new Thread(new ThreadStart(WriteA));
 
Thread myThread2 = new Thread(new ThreadStart(WriteB));
myThread1.Start();
myThread2.Start();

模擬不同使用者在同一時間
寫入相同檔案的狀況。。。

private void WriteA()
 
{
 
    rwLock.AcquireWriterLock(10000);
 
    using (FileStream fs = new FileStream(@"C:\ReaderWriterLock.txt", FileMode.Append, FileAccess.Write))
 
    {                
 
    
    StreamWriter sw = new StreamWriter(fs);                               
    
    sw.WriteLine("A:" + DateTime.Now.ToString());
    
    sw.WriteLine();
    
    sw.Close();
    
    DelegateChangeLabel dclDelegate = new DelegateChangeLabel(ChangeLabelA);                
    
    label1.BeginInvoke(dclDelegate);
    
    Thread.Sleep(5000); 
    }
    rwLock.ReleaseWriterLock();
 
}
 
 
private void WriteB()
 
{
    rwLock.AcquireWriterLock(10000);
    using (FileStream fs = new FileStream(@"C:\testReaderWriterLock.txt",FileMode.Append,FileAccess.Write))
 
 
    {
    
    StreamWriter sw = new StreamWriter(fs);                               
    
    sw.WriteLine("B:" + DateTime.Now.ToString());
    
    DelegateChangeLabel dclDelegate = new DelegateChangeLabel(ChangeLabelB);
    
    label1.BeginInvoke(dclDelegate);
    
    sw.WriteLine();
    
    sw.Close();                
    }
    rwLock.ReleaseWriterLock();
 
}

rwLock是ReaderWriterLock物件
我利用ReaderWriterLock物件的AcquireWriterLock方法
去鎖定寫入檔案動作,直到ReleaseWriterLock方法
去釋放鎖定。。。

簡單的測試。。小小心得紀錄。

沒有留言:

張貼留言