假設我有一個方法是這樣,當然,有可能我的語法是錯的
Public async void Run (){
var rst=await xxx();
var rst2=xxx();
}
為什么要用第一種而不是第二種,好吧,異步。但我知道,對于介面來說,每個請求都是異步的,為啥還要在方法里面使用異步呢?
我覺得這是為了異步而異步。
如果是并行我還能理解,等待好幾個方法執行完成再往下走嘛!這樣或許可以提高執行效率。
應該是我對Task理解不夠吧!望大神給個通俗易通的決議,感激不盡!!!
uj5u.com熱心網友回復:
我的是介面指的是wcf、webapi...這種介面!uj5u.com熱心網友回復:
await是什么,await是等待,等待執行結果。所以我們并不關心你是什么wcf,webapi。
我們只關心你想不想要執行結果,不想要結果你就第2種,想要結果你就第一種
是的,一年前那幾個5年的新人告訴你,想要結果,放個定時器啊,回圈啊,加個變數啊,這是標準回答
而1年后,讓他們自己回答,還是標準回答么
uj5u.com熱心網友回復:
我第二種也能回傳結果啊uj5u.com熱心網友回復:
await是異步等待如果xxx是個異步方法。
var ss = await xxx() 就是異步等待回傳結果。
xxx();是異步執行,不考慮回傳結果
var ss = xxx().Result 是同步獲取回傳結果。
舉個例子:
public void Method1(){
列印日志 11
Method2()
列印日志22
}
public async void Method2(){
代碼段1
列印日志33
await xxx();//xxx()比較耗時 可用Task.Delay()代替測驗
列印日志44
代碼段2
列印日志55
}
日志順序為 11 33 22 44 55,也就是Method2執行完代碼段1就先回傳了
建議百度.net awai機制
uj5u.com熱心網友回復:
public async Task<bool> ExcuteSql() {
//執行插入資料
return true;
}
public bool ExcuteSql_2() {
//執行插入資料
return true;
}
public async void InsertData() {
var rst = await ExcuteSql();
var rst2 = ExcuteSql_2();
}
uj5u.com熱心網友回復:
介面跟你的問題有關系么?沒關系,不要胡亂聯系。是,你可以說你是iis的,iis每個訪問都是獨立執行緒。
獨立執行緒和異步有關系么??執行緒是執行緒,異步是異步。還是那句話少看博客園,執行緒和異步本身就是兩個獨立概念。
執行緒是cpu并發,單執行緒和多執行緒是一組概念
異步是IO--------同步IO和異步IO才是一組概念
所以,你wcf如何,webapi如何,根本就和你討論的題目沒有1毛錢的關系。不要學博客園那種亂攀關系的搞法。你想亂攀關系,那就請做好去討論String血案的準備,很簡單,為啥博客園們整天折騰一個string。因為他們喜歡把各種名詞和概念亂攀關系。
是的,如果你認為wcf就是異步,ok,那么你可以不await,那么如果這個Run需要執行5秒,那么他就執行5秒,如果這個run里有個string,ok,這個5秒string不釋放的,因為你還在用著,所以他們開始亂攀關系了。string讓我的系統崩潰了。我們說不是string讓你的系統崩潰的,是你自己寫的東西讓你系統崩潰的
await xxx()則是另外的東西,他回拆成更小的執行單元,這些更小的執行單元,會把你的5秒,拆成N個更小的執行單元,假設其中一個要用string的單元只要1秒鐘,他執行完畢string不用了。你猜博客園們的那個最喜歡的鍋string還有木有??
uj5u.com熱心網友回復:
我們說了異步和同步才是一組概念。
所以你問我們為啥要異步,那么我們就只能問,你想同步么??異步的概念是“我讓別的人做,做好了通知我,同時在這個期間我還可以做其他的事情”
同步的意思是“我讓別人做,但是現在我等著他做完,這期間我啥也不做,就站在他背后盯著他”
iis,wcf是多執行緒了,可以并行訪問了。但是他并行了,你就不管了???不管可以,不管的話,那就請移步到博客園去討論“血案”就行了
uj5u.com熱心網友回復:
https://www.cnblogs.com/huangxincheng/p/14743654.htmlOK,你準備好看博客園了么,正好那些個喜歡亂攀關系的血案來了,正好這血案就是1年前那幾個5年的新人給你標準回答,正好這有是一個喜歡亂攀關系的博主
請準備好。非要把執行緒和異步拿著一起亂攀關系的結果
“執行緒等于異步,所以請開執行緒,然后放定時,放變數,用定時器檢測結果”
uj5u.com熱心網友回復:
你覺得這是為了異步而異步。那你就不用就是了,本來就沒有必要跟在別人屁股后面轉
uj5u.com熱心網友回復:
異步使用場景基本是不需要回傳結果的,或者回傳結果影響不大的同步是必須要拿到回傳結果的
如果你有2步操作串聯,
第一步,查詢用戶是否存在
第二步,插入用戶
那么第一步你必須await等待回傳,因為存在你插入必定失敗
第二步就看你自己意愿,可以異步也可以同步
uj5u.com熱心網友回復:
簡單說為啥異步方法要await呢?因為微軟給的語法糖啊,其實你可以不這么寫的你可以寫回呼方法,也能獲取異步結果;
而微軟就是為了讓異步在寫法上與同步趨于一致,所以設計了async與await這種模式;
我印象里Task是先有的,那時候是沒有async與await的,想拿到異步結果就只能寫回呼方法;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/283754.html
標籤:C#
