2008年10月16日 星期四

在Windows Service 讀不到 Register 的值

今天使用 Microsoft.Win32.Registry 類別
HKEY_CURRENT_USER\Software\下建立一個名稱為 "TMM" 的機碼
HKEY_CURRENT_USER\Software\TMM 下建立了一個,名稱為 "Path" 資料為 "C:\" 的字串值

當我在Windows Form 下做資料取回測試的時候,
string keyName = "HKEY_CURRENT_USER\Software\TMM";
string path = (string)Registry.GetValue(keyName, "Path", null);
一切都很正常

當我以同樣的方式把code加到我的 Windows Service後,卻怎麼樣也取不到值
看了http://topic.csdn.net/t/20040728/16/3219207.html此討論串之後
得知 Windows Service 讀取 HKEY_CURRENT_USER 下的資料是有些限制的

最後也因為怕麻煩,所以將原本寫在 HKEY_CURRENT_USER 的資料
全部改寫在 HKEY_LOCAL_MACHINE,問題就解決了。

2008年10月8日 星期三

C# 提供的Timer不準啦!

今天將Timer的Interval設為1000以下的時候發現被觸發的間隔時間並不是那麼準
Interval 設為 1 的時候 15ms 或 16ms 才會觸發一次
Interval 設為31的時候 31ms 或 32ms 才會觸發一次
Interval 設為32的時候 32ms、46ms 或 48ms 才會觸發一次
Interval 設為33的時候 45~48ms 才會觸發一次
這結果還滿怪的,不過看得出來有些規律性,每次約以15ms或16ms遞增。
ps. 搭配Stopwatch去看

看來只能直接使用win32的API了,不過高興的是在CodeProject有人將它包起來了。

http://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx

2008年10月5日 星期日

C# 建立多參數的方法

有使用過 string.Format() 的都知道
在第一個參數之後可以接N個參數,如:
string.Format("{0}{1}{2}...{N}",v1,v2,...,vN);
這不可能用多載來建構N個方法吧
=.=

C# 中可利用 params 關鍵字來建立此方法

在使用上有幾點限制:
1. 在使用params之後不可以在有其他的參數
 void Test(string arg1, params object[ ] args, object count){...} //錯誤
 void Test(string arg1, params
object[ ] args){...} //正確
2. 一個方法中只能有一個 params 參數
 void Test(string arg1, params object[ ] args1, params object [] args2){...} //錯誤
3. 使用 params 的參數必須是一維陣列
 void Test(string arg1, params object arg){...} //錯誤

下面是一個將所有參數列出來的簡單例子:
public static void WriteAllParameters(params string[ ] list)
{
 for ( int i = 0 ; i <>
  Console.WriteLine( list[i] );
}