今天在寫多線程同步執(zhí)行一個接口時,用到了AutoResetEvent這東西。因為很久沒寫C#又固,(都在寫OC),忘記了煤率。所以打算寫篇文章記錄關(guān)于線程的內(nèi)容仰冠。大致是借鑒了博客文章async & await 的前世今生.
區(qū)別:
Thread(.Net1.0出現(xiàn),創(chuàng)建不會再線程池,沒有返回值)
Task(.Net4.0出現(xiàn)涕侈,4.5引入Run方法沪停,默認(rèn)會直接使用線程池)
async & await(.Net4.5出現(xiàn))
創(chuàng)建:
注意:如果我們不使用Task,又想用線程池的話裳涛,可以使用ThreadPool類木张。Thread是不會放到線程池的
共享數(shù)據(jù)
在使用多線程的時候經(jīng)常會碰到,多個線程需要使用一個資源對象端三,這樣就會造成這資源對象混亂舷礼。所以需要多線程同步(串行執(zhí)行,等待執(zhí)行)郊闯。
方法其實很多:
a.全局變量判斷是否進(jìn)入
b,lock
c,線程阻塞:信號量(AutoResetEvent妻献,ManualResetEvent,Semaphore)
lock的話一般會用在內(nèi)存只分配一次的變量上团赁。一般是全局的靜態(tài)變量
信號量的用法比較簡單育拨,set()通知可以讓下一個進(jìn)程執(zhí)行啦,waitone()讓下一個線程等待欢摄,至于這三個的區(qū)別熬丧,這里不詳細(xì)說。
異步等待async & await
流程解釋:
1.進(jìn)入Main()方法怀挠,執(zhí)行DisplayValue()方法析蝴,原本應(yīng)該等待DisplayValue()方法執(zhí)行完畢再往下執(zhí)行輸出代碼害捕,但是DisplayValue()方法修飾了async,這就表示異步去執(zhí)行這個方法闷畸。所以是并發(fā)的尝盼。即輸出”MyClass() End.”,同時還在執(zhí)行DisplayValue()方法佑菩。
2.在進(jìn)入DisplayValue()方法時盾沫,按理說:應(yīng)該馬上輸出“”Value is :result",但是看到await修飾的GetValueAsync()方法殿漠。所以必須等待GetValueAsync()方法完成后才能執(zhí)行下一句代碼疮跑。