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方法
去釋放鎖定。。。

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

2009-03-10

Regex 檢驗機制的小嘗試

在撰寫程式的時候,我們大都會遇到關於字串解析的問題
譬如:所輸入的字串是否符合規定,
或是擷取字串其中某一小段,或是判別字串是否等於某個值

今天的小嘗試,所要做的就是去判別所輸入的字串
是否符合格式。。。所使用的是Regex這個類別

就已簡單判斷E-Mail輸入正不正確
程式碼如下:

 Regex r = new Regex(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
 
Match m=r.Match(tbxMail.Text);
 
if (m.Success)
 
  MessageBox.Show(m.Value);
 
else                
 
  MessageBox.Show("輸入Mail格式錯誤!");     

在建立Regex物件時,所傳入的建構式參數
是Regular Expression字串
(其實到現在為止,我還不知道這個字串該怎樣去拼湊)
所以我上網去找關於E-Mail的Regular Expression
簡單結果測試如下:
image
image 

參考資料:
MSDN: Regex 類別
RegExLib.com
Regular-Expressions.info

2009-03-09

MVC的小體驗

MVC
最近寫了一支小程式,為了專案上的便利性
必須同時要完成使用者該做的事項
有點像是使用者初始化的小功能
(當使用者使用我們系統時,就先幫他處理完該做的事項)

當時有點小時間,所以想嘗試看看MVC這個design pattern
因為需求並不多,只需要簡單做一些事情即可
設計的概念是這樣。。
View部分完全單純處理顯示資料進度與結果
所有的動作都集中在Model裡背景執行
Controller部分則利用Event來傳遞顯示的事件、觸發事件

當時我並未考慮太多,所以所有的動作都集中在Model
(同一個Class裡)

 image
但需求是會不斷變更的,結果剛開始幾個需求變更
我都還能輕鬆應付,因為只要變更Model
而View只要負責顯示就好。。。
接下來的功能需求,真的把我搞的快瘋掉

我不該將所有的功能都集中在一個Class裡設計
每個物件都應該有他自己的功能
即使只是一個小小的功能,他也應該是要分開出來
[集中]-只會讓我更難去維護

所以我花了一些時間
將原本的Model分開了許多小部份
 
image

將Model分開之後,原本複雜的Model
變的更簡潔易懂,也更容易進行維護
寫下小小心得,紀錄這件事情!

參考資料:
Topic: JSP 架構介紹 - Model1 , Model2 , and Model2x
The Model-View-Controller Design Pattern
Building Graphical User Interfaces
MVC#
Model-View-Controller Pattern