2012年1月30日 星期一

C# 擴充方法 - Extensions

因為有需要要把 DataTable 的資料倒出來到 csv 檔案裡面去,
想要有很簡易的使用方式,
於是乎就參考到了 擴充方法 (C# 程式設計手冊) ,
程式寫完之後我就可以直接用 DataTable.ExportCSV 來使用我新增的方法了!
如下圖所示:



可以直接這樣點出來是不是很棒!
那這樣的程式該怎麼寫呢?

2012年1月27日 星期五

C# Threading Finial

上一篇文章(C# Threading - 使用 WaitHandle)有提到
【主執行緒要等副執行緒查完之後才會更新介面上的資訊感覺很鳥】,
所以今天我要來改善這個問題,
基本上我想到的解法就是把原本查詢按鈕按下去裡面的程式改成另一個獨立的函式,
然後用副執行緒去呼叫,
所以原來的 btnThreadingQuery_Click 就變成下面這樣啦!

private void btnThreadingQuery_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(QueryMain));
}

原來裡面的程式就被我移到了 QueryMain() 去了,然後妳還記得嗎?
在第一篇文章(C# 多緒程式該怎麼寫? - Threading)的時候,
我曾經說過副執行緒不可以直接去處理 UI 相關的東西,
所以原本我們在裡面有去控制按鈕跟滑鼠游標也要依照第一篇的觀念去修改,
全部的修改內容如下:

2012年1月23日 星期一

C# Threading - 使用 WaitHandle

上一篇文章(C# 多緒程式該怎麼寫? - Threading)說到,
副執行緒還再跑的時候按鈕卻已經浮起來了,
然後總執行時間也不太對,
因為那個總執行時間並不包含副執行緒跑完的時間!
沒想到這麼快我就找到了解決的方法了!
誤打誤撞的找到了 WaitHandle 的範例,
於是就照著範例改了一下程式,
範例如下:
先宣告 WaitHandle 的陣列

    // Define an array with two AutoResetEvent WaitHandles.
    static WaitHandle[] waitHandles = new WaitHandle[]
    {
        new AutoResetEvent(false),
        new AutoResetEvent(false)
    };

然後使用方式如下:

ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask),         
        waitHandles[0]);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoTask), 
        waitHandles[1]);
WaitHandle.WaitAll(waitHandles);

然後在副執行緒的最後要補上一行,
將傳進來的 AutoResetEvent 呼叫 Set(),
範例上是這樣寫的,如下:

are.Set();

看起來好像不難,所以我就先照著改一下囉!

2012年1月19日 星期四

C# 多緒程式該怎麼寫? - Threading

之前為了需要寫了一個多緒的程式,
為了怕忘記,所以寫了一個簡單的程式來紀錄一下多緒的程式該怎麼寫,
這樣以後自己才有的參考。

簡單的說就是兩個按鈕,一個是單緒的查詢、一個是多緒的查詢,
兩個查詢的內容基本上是一樣的,先查詢一個筆數很多的資料表,
然後再查一個筆數比較少的資料表。

程式執行的畫面如下:


由於單緒的程式會等第一個查詢完了之後才查第二個資料表,
所以妳會發現第二個查詢的時間其實就等於全部查詢的時間;
但是如果是多緒的程式的話妳就會發現第二個查詢的筆數跟時間會比較快出來,
而全部的執行時間其實只有1毫秒,因為這個只是去呼叫程式的時間,
並不是全部查詢完之後的時間。
(突然發現毫秒的字錯了!!!)

先來看看單緒的程式的寫法吧!

C# 計算執行時間的物件 - CalcTime

為了計算執行時間方便使用,
所以寫了一個計算時間的物件,
沒甚麼特別的,所以直接分享程式碼吧!

CalcTime 物件的使用方式如下:
第一步,先建立物件:

CalcTime calcTime = new CalcTime();


第二步,程式執行完了直接呼叫 Duration(),會直接丟出執行的毫秒的字串。

calcTime.Duration();


如果需要重新計算的話,直接呼叫 Restart() 就會重設了,不需要重新建立 CalcTime 物件。

calcTime.Restart();


CalcTime 物件的程式碼如下:

public class CalcTime
{
    TimeSpan tsStart;
    public CalcTime()
    {
        tsStart = new TimeSpan(DateTime.Now.Ticks);
    }
   
    public void Restart()
    {
        tsStart = new TimeSpan(DateTime.Now.Ticks);
    }

    public string Duration()
    {
        TimeSpan tsEnd = new TimeSpan(DateTime.Now.Ticks);
        TimeSpan ts = tsStart.Subtract(tsEnd).Duration();
        return ts.Milliseconds.ToString() + "毫秒";           
    }
}




2012年1月4日 星期三

SQL NOT EXISTS 怎麼用?

今天在系統的實作上發現需要新增存在於 Product 資料表,
但是不存在於 Promotion 資料表的資料,
直覺就是應該是用到 SQL NOT EXISTS 的方式來處理,
不過左寫右寫的,
不管怎麼寫,不是說我語法不對就是跑出來不是我要的結果?
EXISTS 的線上說明看了又看,
明明就是照著寫,
怎麼出來的就是不是我要的呢?

後來請教了 SQL 大師才終於出現了我想要的結果,
很好奇有人因為看了 EXISTS 的線上說明就會寫的嗎?

好了!廢話不多說,我們先來看看 Product 資料表裡面的內容。
裡面總共有 5 筆資料。


然後 Promotion 資料表裡面總共有 2 筆資料。


所以我想看到的是 ProductNo 2, 4, 5 這 3 筆資料,寫法如下,請享用。