petshop4 0學習筆記之多執行緒

2021-08-23 15:23:22 字數 3660 閱讀 1825

一直搞web開發,每天接觸最多的就是asp.net+css+js,看了看petshop,原來多執行緒在web專案中也有很大作用.加之以前一直對多執行緒不甚了解,這次就這個機會來一次自我補習吧.

啟用乙個新執行緒有四種寫法:

第一種:使用thread與threadstart/parameterizedthreadstart類

static void main(string args)

console.read();

}static void print()

}static void print(object obj)

}

threadstart類與parameterizedthreadstart類區別就是前者不能傳參,而後者可以.

在2.0支援匿名委託的基礎上,threadstart類與parameterizedthreadstart類可以不寫:

thread th = new thread(print);

thread thp = new thread(print);

這種開啟線的方式有個限制,就是其包裝的方法的方法簽名必須與委託一致:無返回值,無參或者只有乙個object型引數.

第二種:使用執行緒池:

class program

console.read();

}static void print(object obj)}}

如無特殊要求,這種方法是可以使用的,它讓.net自行維護執行緒資源的開啟與釋放.

以上兩種方法都有很大限制,就是不能讓任意方法開啟執行緒,當然,這是有方法解決的,就是把你需要的方法再封裝成與委託相對應的簽名,這無疑是把問題搞複雜了,所以就有了以下兩種方法:

第三種:使用asynchronous results模式

delegate int getnumberhandler(string pre, string last);

static void main(string args)

console.readkey();

}static int getnumber(string pre, string last)

return j;

}static void complete(iasyncresult result)

說白了,就是給你需要開啟執行緒的方法宣告乙個委託,然後用委託封裝方法,最後執行委託的begininvoke方法.就會自己開啟乙個執行緒了,然後用endinvoke方法來獲取執行結果.其中其第一,二個引數是與你宣告的委託有關的,委託有幾個引數,這裡就需要幾個引數,其中in與ref引數需要寫在begininvoke內,ref與out引數需要寫在endinvoke內,如:

delegate bool handler(string str, ref object obj, out object obj2)

begininvoke(string str, ref object obj)

endinvoke(ref object obj, out object obj2)

後面兩個是固定引數.前乙個是當非同步執行緒結束時會呼叫的方法,後乙個是傳給結束呼叫方法的引數.從result.asyncstate獲取.上面的demo內有交待,就不多說了.

這種方法最靈活,但是如果你想對非同步的執行緒有更多的控制時,就可以使用第四種方法:

第四種:background worker模式

static backgroundworker bw = new backgroundworker();

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;

}

將要非同步執行的方法加入dowork委託,將要進行進度控制的方法加入progresschanged 委託並將workerreportsprogress 設為true,通過reportprogress()方法來觸發程序控制.將執行緒完成時需要執行的方法加入runworkercompleted委託,如果中途想中段程序,需要將workersupportscancellation 屬性設為true,並通過呼叫cancelasync()方法來中斷程序.通過cancellationpending屬性來判斷程序是否被中斷.最後,通過runworkerasync()方法來啟動執行緒.

這種方法給予我們強大的執行緒控制能力,不過它的弱點也很明顯,就是被它封裝的方法必須滿足它的方法簽名.

從上面看來多執行緒似乎很簡單,其實不然,多執行緒難點之一就是執行緒同步,就是對同一物件同一時間只能有乙個執行緒進行訪問.net中是能過monitor與lock關鍵字來進行同步的:

const int nmax = 1000000;

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()

}

比如++與--操作,雖然是乙個操作符,但實際.net運算中是分為多個步驟進行的,如果乙個步驟沒有進行完就切換成另乙個執行緒操作,其結果就只能是得不到想要的結果,辦法就是加入上面所示的**來強制保證執行的完整性.不過因為使用了同步,所以效能會有一定程度的損失.上面的例子請用百萬以上的數字進行測試.

下面來談談winform下的多執行緒.上面的例子全是在控制台下執行的,而winform下的多執行緒則大同小異:

public form1()

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

}

在winform下,控制項只能被它建立的控制呼叫.如果想被另乙個執行緒訪問,則需要進行判斷:

invokerequired
invokerequired需要比較呼叫執行緒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...