欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
《CLR via C#》讀書(shū)筆記

《CLR via C#》讀書(shū)筆記-.NET多線(xiàn)程(六)

作者:zlbcdn

parallel處理
當存在以下情況:
1、需處理多個(gè)獨立方法
2、各方法之間不存在共享資源的情況
3、各方法可以使用相同的委托
就可以使用Parallel類(lèi)的相關(guān)方法進(jìn)行處理
以下是官網(wǎng)上的一個(gè)例子,

using System.Threading.Tasks;   class Test{    static int N = 1000;    static void TestMethod()    {        // Using a named method.        Parallel.For(0, N, Method2);        // Using an anonymous method.        Parallel.For(0, N, delegate(int i)        {            // Do Work.        });    //Using ForEach    Parallel.ForEach(collection,item=>DoWork(item));        // Using a lambda expression.        Parallel.For(0, N, i =>        {            // Do Work.        });    }    static void Method2(int i)    {        // Do work.    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

個(gè)人認為在這功能有點(diǎn)語(yǔ)法糖感覺(jué)。原因有兩個(gè):
原因一:從這個(gè)語(yǔ)法的本身而言,其使用多線(xiàn)程處理操作,本身就會(huì )消耗資源,因此parallel類(lèi)更適合處理較復雜、耗時(shí)較長(cháng)的操作。范圍縮小了!
原因二:即使處理較復雜、耗時(shí)較長(cháng)的任務(wù),在業(yè)務(wù)上也大多是使用同一數據庫事務(wù),這樣就能保證要么全成功要么全失敗。而使用parallel類(lèi)出現部分失敗時(shí),對于業(yè)務(wù)而言就比較困難了。
綜上,個(gè)人認為對于parallel適應的范圍不是很大。
定時(shí)器
定時(shí)器需要好好的寫(xiě)寫(xiě)!我的業(yè)務(wù)程序有一需求,就是比較頻繁的定時(shí)查找數據,并將數據打印出來(lái)!之前使用WinForm界面上的timer,結果悲劇,當處理大量數據時(shí),會(huì )存在兩個(gè)問(wèn)題:1、界面卡死;2、相同的內容會(huì )打印多遍(一般會(huì )打印2遍)。這兩個(gè)問(wèn)題那段時(shí)間經(jīng)常被業(yè)務(wù)部門(mén)投訴!后來(lái)使用了多線(xiàn)程的定時(shí)器,解決了這個(gè)問(wèn)題。
System.Threading.Timer類(lèi)的構造函數如下所示:

public Timer(TimerCallback callback,object state,int dueTime,int period)
  • 1

Timer構造器中四個(gè)參數的的定義分別如下:
callback的委托定義如下

public delegate void TimerCallback(    object state)
  • 1
  • 2
  • 3

state為callback的參數值,若為空,可為null;
dueTime為從準備到執行的時(shí)間
period為時(shí)間每次操作的時(shí)間間隔
因此timer的一般使用方式如下:

//以下代碼為偽碼private system.threading.timer doSomeThingTimer=null;//開(kāi)始執行定時(shí)操作的button按鈕public void button_click(e){    doSomeThingTimer = new system.threading.timer(doSomeWork,null,5000,timeout.infinite);}//具體的業(yè)務(wù)邏輯方法private void doSomeWork(object status){    //業(yè)務(wù)邏輯代碼    //這兒一定要使用change方法,改變定時(shí)操作    doSomeThingTimer.change(8000,timeout.infinite);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

以上就是使用timer的具體方法,其中doSomeWork方法中使用了change方法。原因如下:若不使用change方法,而是在timer中定義好操作每次的執行間隔,則會(huì )出現以下情況。若操作的時(shí)間很長(cháng),超過(guò)了每次的執行間隔,則線(xiàn)程池就會(huì )調用額外的線(xiàn)程去執行操作,相當于有兩個(gè)線(xiàn)程分別去執行doSomeWork。因此,為了避免這種情況的發(fā)生,需要在操作中使用change方法。
Timer小結
1、system.threading.timer類(lèi)是使用線(xiàn)程池線(xiàn)程,其內部使用了Threadpool.queueUserWorkItem()方法。這也是為何timer的委托與queueUserWorkItem的委托一致的原因。
2、在線(xiàn)程池內部,線(xiàn)程池為所有的system.threading.timer共同使用一個(gè)線(xiàn)程。若一個(gè)不夠用,則會(huì )額外再開(kāi)立新的線(xiàn)程
3、system.windows.forms.timer中也有一個(gè)定時(shí)器,但該定時(shí)器屬于UI線(xiàn)程,實(shí)UI線(xiàn)程有一消息泵,定時(shí)啟動(dòng)該定時(shí)器。這個(gè)定時(shí)器適合用于非常簡(jiǎn)單、耗時(shí)短、更新界面相關(guān)的操作。用于后臺的或耗時(shí)的操作,請不要使用
4、system.windows.threading.dispatcherTimer類(lèi)是system.windows.forms.timer在wpf和silverlight的等價(jià)物
5、system.timers.timer類(lèi)。這個(gè)類(lèi)很有意思,它是一個(gè)控件,當定時(shí)觸發(fā)時(shí),它會(huì )調用CLR的線(xiàn)程池線(xiàn)程進(jìn)行操作。按理說(shuō)它是正合適,但是它也有歷史,它是不應該存在的。因為在微軟大規模整理線(xiàn)程和定時(shí)器相關(guān)的方法之前,就把它留在了FCL中,因此由于歷史原因,它也就沒(méi)被刪除。但平時(shí)盡量不要使用它。
線(xiàn)程池相關(guān)
當前線(xiàn)程池的上限是1000,一般情況下不要更改線(xiàn)程池的任何限定。


當使用threadpool.queueuserworkitem()及system.threding.timer創(chuàng )建的工作項會(huì )存放到上圖中的全局隊列中。然后線(xiàn)程池中的線(xiàn)程(也就是圖中的工作者線(xiàn)程),會(huì )按照FIFO(先入先出,隊列)的原則從全局隊列中獲取工作項,以進(jìn)行完成。在這個(gè)過(guò)程中全局隊列有一個(gè)同步鎖,防止多個(gè)線(xiàn)程搶奪一個(gè)工作項。當工作者線(xiàn)程選取工作項后,全局隊列就會(huì )將該工作項在列表中刪除。
若此時(shí),創(chuàng )建了一個(gè)task,則線(xiàn)程池會(huì )將task工作項放置在上圖中的本地隊列中。從而工作者線(xiàn)程就會(huì )優(yōu)先到本地隊列中獲取工作項。選取方式與全局隊列有區別,是后入先出的原則(即棧)獲取工作項。若本地隊列中已經(jīng)沒(méi)了工作項,則線(xiàn)程會(huì )到其他本地隊列中“偷取”工作項進(jìn)行處理。若所有的本地隊列中的工作項都處理完了,則工作者線(xiàn)程就到全局隊列中獲取工作項。若全局隊列中的工作項都處理完了,則工作者線(xiàn)程就會(huì )睡眠,然后一定時(shí)間段后自然醒來(lái),若發(fā)現還沒(méi)有事情做,就自殺掉。
若是一個(gè)外部的非工作者線(xiàn)程(例如,window線(xiàn)程),則不管是Threadpool還是timer還是task,CLR都將其放入全局隊列中,非工作者線(xiàn)程會(huì )從全局隊列中獲取工作項以進(jìn)行工作。
偽共享
我的系統是64位的操作系統,這也就意味著(zhù),系統可以一次性讀取64byte的數據,因此創(chuàng )建2個(gè)int32的數據時(shí),很有肯能兩個(gè)int32變量存儲在一個(gè)緩存線(xiàn)里。因此有兩個(gè)線(xiàn)程對兩個(gè)變量進(jìn)行多次操作的時(shí)候,就會(huì )因讀取相同的內容而進(jìn)行資源的爭奪,因此會(huì )造成性能的降低。因此為了避免這種“偽共享”的情況導致的性能下降,可以采用一些attribute,使兩個(gè)字段分配到兩個(gè)緩存線(xiàn)中,這樣就會(huì )使性能提升。
26章小結
主要就是講述了task。
待解決問(wèn)題
整理attribute
26章完

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux下的定時(shí)器的實(shí)現
python線(xiàn)程定時(shí)器Timer(32)
python定時(shí)器
51單片機IO口模擬串口通訊C源程
51單片機1602LCD顯示數字頻率計
.NET基礎知識-進(jìn)程與線(xiàn)程
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久