一直搞web開發,每天接觸最多的就是asp.net+css+js,看了看petshop,原來多執行緒在web專案中也有很大作用.加之以前一直對多執行緒不甚了解,這次就這個機會來一次自我補習吧.
啟用乙個新執行緒有四種寫法:
第一種:使用thread與threadstart/parameterizedthreadstart類
static void main(string args)threadstart類與parameterizedthreadstart類區別就是前者不能傳參,而後者可以.console.read();
}static void print()
}static void print(object obj)
}
在2.0支援匿名委託的基礎上,threadstart類與parameterizedthreadstart類可以不寫:
thread th = new thread(print);這種開啟線的方式有個限制,就是其包裝的方法的方法簽名必須與委託一致:無返回值,無參或者只有乙個object型引數.thread thp = new thread(print);
第二種:使用執行緒池:
class program如無特殊要求,這種方法是可以使用的,它讓.net自行維護執行緒資源的開啟與釋放.console.read();
}static void print(object obj)}}
以上兩種方法都有很大限制,就是不能讓任意方法開啟執行緒,當然,這是有方法解決的,就是把你需要的方法再封裝成與委託相對應的簽名,這無疑是把問題搞複雜了,所以就有了以下兩種方法:
第三種:使用asynchronous results模式
delegate int getnumberhandler(string pre, string last);說白了,就是給你需要開啟執行緒的方法宣告乙個委託,然後用委託封裝方法,最後執行委託的begininvoke方法.就會自己開啟乙個執行緒了,然後用endinvoke方法來獲取執行結果.其中其第一,二個引數是與你宣告的委託有關的,委託有幾個引數,這裡就需要幾個引數,其中in與ref引數需要寫在begininvoke內,ref與out引數需要寫在endinvoke內,如:static void main(string args)
console.readkey();
}static int getnumber(string pre, string last)
return j;
}static void complete(iasyncresult result)
delegate bool handler(string str, ref object obj, out object obj2)後面兩個是固定引數.前乙個是當非同步執行緒結束時會呼叫的方法,後乙個是傳給結束呼叫方法的引數.從result.asyncstate獲取.上面的demo內有交待,就不多說了.begininvoke(string str, ref object obj)
endinvoke(ref object obj, out object obj2)
這種方法最靈活,但是如果你想對非同步的執行緒有更多的控制時,就可以使用第四種方法:
第四種:background worker模式
static backgroundworker bw = new backgroundworker();將要非同步執行的方法加入dowork委託,將要進行進度控制的方法加入progresschanged 委託並將workerreportsprogress 設為true,通過reportprogress()方法來觸發程序控制.將執行緒完成時需要執行的方法加入runworkercompleted委託,如果中途想中段程序,需要將workersupportscancellation 屬性設為true,並通過呼叫cancelasync()方法來中斷程序.通過cancellationpending屬性來判斷程序是否被中斷.最後,通過runworkerasync()方法來啟動執行緒.static void main(string args)
static void bw_runworkercompleted(object sender, runworkercompletedeventargs e)
else
}static void bw_progresschanged(object sender, progresschangedeventargs e)
}static void bw_dowork(object sender, doworkeventargs e)
}e.result = result;
}
這種方法給予我們強大的執行緒控制能力,不過它的弱點也很明顯,就是被它封裝的方法必須滿足它的方法簽名.
從上面看來多執行緒似乎很簡單,其實不然,多執行緒難點之一就是執行緒同步,就是對同一物件同一時間只能有乙個執行緒進行訪問.net中是能過monitor與lock關鍵字來進行同步的:
const int nmax = 1000000;比如++與--操作,雖然是乙個操作符,但實際.net運算中是分為多個步驟進行的,如果乙個步驟沒有進行完就切換成另乙個執行緒操作,其結果就只能是得不到想要的結果,辦法就是加入上面所示的**來強制保證執行的完整性.不過因為使用了同步,所以效能會有一定程度的損失.上面的例子請用百萬以上的數字進行測試.static int ncount = 0;
static object obj = new object();
static void main(string args)
th.join();
console.writeline(ncount.tostring());
console.readkey();
}static void change()
}
下面來談談winform下的多執行緒.上面的例子全是在控制台下執行的,而winform下的多執行緒則大同小異:
public form1()在winform下,控制項只能被它建立的控制呼叫.如果想被另乙個執行緒訪問,則需要進行判斷:private void btnchange_click(object sender, eventargs e)
public void change()
else
}private void btnchange2_click(object sender, eventargs e)
delegate void change2handler(object obj);
public void change2(object obj)
else
}
invokerequiredinvokerequired需要比較呼叫執行緒id和建立執行緒id,如果它們不相同則返回true,這時,就需要用乙個委託對此方法時行封裝,如上面的系統委託methodinvoker 與 自己編寫的委託 change2handler.然後呼叫invoke方法,通知建立執行緒來執行這個委託.
當然,還有另外乙個方法:
control.checkforillegalcrossthreadcalls = false;如果設成false.net就不會對程序間呼叫進行檢查,這樣就可以跨執行緒對控制項進行操作.
Petshop4 0學習日誌2
2 petshop的訂單處理 petshop中對訂單的處理主要使用了策略模式 同步和非同步 1 同步 petshop系統預設的就是同步策略 在bll業務層的order中,插入資料時,首先利用反射機制確定使用的策略模式,預設選擇同步機制。對於,同步機制,系統直接呼叫idal,對資料進行操作,插入資料。...
PetShop 4 0 安裝問題
1.無法直接啟動帶有 類庫輸出型別 的專案 若要除錯此專案,請在此解決方案中新增乙個引用庫專案的可執行專案。將這個可執行專案設定為啟動項 經查詢處理方法 出錯原因 在同乙個解決方案裡面有多個專案,被設定成啟動專案的是類庫專案,類庫專案是被編譯成dll檔案給別的專案使用的,是不可執行的專案.解決辦法 ...
PetShop 4 0學習 介紹及安裝
圖18 1 petshop 4.0安裝介面圖1 petshop 4.0的安裝過程與安裝其他應用程式類似,只要不斷單擊 下一步 按鈕即可。在整個安裝過程中,需要注意兩個方面 一是petshop 4.0安裝程式允許使用者設定原始檔儲存目錄 見圖18 1 預設情況下,原始檔儲存在c program fil...