關於c await使用總結

2021-09-26 05:57:42 字數 1527 閱讀 4611

在開發乙個模擬人工自動網銀轉賬的軟體的時候,大量使用了async+await,在專案成功上線並且迭代了若干版本後,對於await相關的**進行了重構,目前的結構更清晰,可擴充套件性更強。同時對於await的使用也從很初級,變得有一些經驗,現在把這些經驗總結如下:

1 await和async配對使用。最典型的應用如下:

下面的**是不用執行緒的情況,winform就會在5秒的無響應狀態後才會在testbox中顯示「test」,使用者體驗不好。

private string teststring()

private async void btngetandtransfer_click(object sender, eventargs e)

下面的**使用傳統的threading技術更新textbox的內容,非常複雜,**難於維護

public partial class form1 : form

public void settextbox(string value)

);return;

}textbox1.text = value;

}void samplefunction()

}

下面的**使用await+async實現了第一段**的功能,並且解決了winform凍結的問題。從**的結構來說,也是清晰易讀。 

private async taskteststring());}

private async void btngetandtransfer_click(object sender, eventargs e)

從以上的**示例來看await+async雖然是語法糖,但是有明顯的的優勢。

2 雖然await+async有以上所說的優點,但是,如果大規模使用一定要慎重:

a 方法體中使用await,方法也必須宣告為async,另乙個方法呼叫宣告了async的方法,也需要用await,如果不用await,就會立即從被呼叫方法返回,繼續執行後面的**,而不會等待被呼叫async方法實際執行完畢再繼續執行後面的**。但是大多數情況下,呼叫async 方法都需要等待對方執行完再繼續執行後面的**,結果就因為某個方法裡面用了await,導致呼叫它的整個call stack上的method都需要await+async,搞得很多**被await傳染。

b 我在**中用到了action,就是為了可以把配置檔案中的字串對應執行相應的方法。但是,action是個template class,不能同時相容async和非async方法,結果導致用了await的方法只能另外處理。(action應該也可以使用async方法,參考:

3 從**整體的架構設計來說,如果乙個很深的call stack都用了await,那麼就可以換個思路,不要讓最裡面的方法啟動執行緒,而是把啟動執行緒的**放到最外面,這樣一來絕大部分方法就都不再需要用async修飾了,方法就都可以用正常的方式開發了,也不會再把async傳染到新的模組中。

換句話說,async和await應該在貼近ui的地方使用,不要在基礎功能的**中使用。

關於fastjson使用總結

1 背景 專案需要從其他廠商中將資料轉接過來,存到自己的資料庫中,根據三方廠商提供的api介面文件來對接。2 實現 對於這種資料轉接的問題,就像usb轉接頭一樣,兩端的東西肯定是有差異,所以才需要中間這個協議來處理,自然對於資料庫的表結構,就需要加對映表來儲存兩者之間的關係,各種字段雖然不同,但是業...

關於Oracle使用總結

select a into b from table name 必須只存在一條記錄 必須能夠查到值,如果查不到記錄則報錯,nodatafount a 表示 a select from a pay flow a where a.cons no a and rownum 1 select from a ...

關於git上傳使用總結

1.將本地 上傳到遠端倉庫 2.git emote origin already exists錯誤的解決辦法 先輸入 git remote rm origin 2 再輸入 git remote add origin git init 初始化版本庫 git add 新增檔案到版本庫 只是新增到快取區 ...