經過本周的努力,昨晚終於完成OSS.Social微信項目的標準庫支持,當前項目你已經可以同時在.net framework和.net core 中進行調用,調用方法也發生了部分變化,這裡我簡單分享下,主要包含下邊幾個部分: · 移植後的變化 · 和OSS.Common,OSS.Http關係 · 非同步 ...
經過本周的努力,昨晚終於完成OSS.Social微信項目的標準庫支持,當前項目你已經可以同時在.net framework和.net core 中進行調用,調用方法也發生了部分變化,這裡我簡單分享下,主要包含下邊幾個部分:
· 移植後的變化
· 和OSS.Common,OSS.Http關係
· 非同步(Task)使用介紹
一. 移植後的變化
如果不瞭解OSS.Social的同學,可以參看我前面的幾篇文章介紹,這裡就不多說了。這次移植的變化首先是對.net core項目能夠提供直接的支持,當前的使用的.net standard標準庫版本為1.3版,對應的framework支持為4.6版,對應.net core 的版本現在基本都支持,源碼詳見github,在項目我提供了Framework 4.6的單元測試項目,和.netcoreapp1.0的網站項目。由於時間不充裕,並沒有做全部介面測試,如果發現有bug可以及時和我聯繫。
其次是對非同步的支持,這個也是這次變動最大的地方,幾乎公號管理功能(Offcial)模塊下的所有核心方法都轉為非同步方式提供,這些完全歸功於HttpClient帶來便利,在底層IO層面提供了最基礎的非同步支持。
當前可以像如下方式調用:
當然,在很多情況下需要及時對結果進行處理給出對應的響應信息,為了這種同步需求,所以我通過調用Task的wait()方法,封裝了一個簡單的擴展方法WaitResult(),直接可以如下調用:
二. 和OSS.Common,OSS.Http關係
OSS.Common和OSS.Http我很早以前寫的兩個基礎模塊,現在都統一到OSS系列下,現在都已經提供了.Net Standard的支持。前者負責全局結果實體,加密演算法,基礎輔助類的實現。像在介面方法中所有的返回實體都會繼承ResultMo實體,其中提供了IsSuccess屬性,Ret和Message信息,統一項目中的傳值以及結果判斷,統一判斷依據。後邊會有針對它的文章介紹,這裡略過,如果你想在項目中使用它,可以直接通過Nuget安裝:
至於OSS.Http,主要負責對Rest介面請求的封裝,底層已經由HttpWebRequest遷移至HttpClient模塊,如果你感興趣,可以參考我寫的《完成OSS.Http底層HttpClient重構封裝》的文章,當前也可以通過Nuget安裝:
三. 非同步(Task)使用介紹
1. 基本介紹
因為在這個項目中使用了大量的async非同步關鍵字,所以對於這種情況使用較少的同學可能略微有些不適,那這裡我主要把非同步的常見使用情況給大家介紹下。
非同步在我印象中,從.net體系下最開始的使用Thread,到後來的Task,再後來的async和wait關鍵字。它的語法越來越精簡,在Framework2.0時代我們可能需要通過 new Thread(執行任務).Start() 方式來創建非同步線程。因為系統線程的頻繁創建會造成系統資源的大量消耗,所以.net維護了一個線程池,可以讓我們通過 ThreadPool 來直接調用線程池中已經維護好的線程,我們可以很簡單的通過 ThreadPool.QueueUserWorkItem(執行任務) 完成非同步線程的調用。
再後邊.net 提供了 Task.Run(()=>{ 執行任務 }) 這種形式的非同步調用,這種形式預設使用線程池下的線程,同時返回一個 Task 對象,可以通過這個對象來等待或者判斷任務的完成狀態等。
雖然這個時候使用多線程非同步操作已經相當簡單了,但是有時候非同步代碼還是要單獨進行處理,會造成一定的層級關係。所以後來就有 async和await 關鍵字,可以讓我們能夠像同步流程一樣寫非同步代碼。在下邊我用一個簡單的例子講解一下。
2. 使用形式:
這裡我通過一個簡單的例子來給大家分享一下,假如我們現在有一個需求,需要通過用戶手機號,請求另外一個系統下的用戶名,並給用戶推送簡訊消息。下邊是我使用asyn和await寫的一個簡單例子。
在這個例子中,如果你把await和asyn拿開,那麼流程就是一個完整的同步流程,但是加上之後就變成了一個非同步。
這裡要特殊說一下,await後邊並不是立刻執行非同步,他只有在真正的非同步操作時才會處理,在這個例子中,也就是1,2,3 步會同步執行,4,5則是在非同步線程中執行,同時在執行第4步時,UpdateUserInfo()方法結束返回
3. 異常註意問題:
對於非同步異常,我推薦這篇文章《關於C#中async/await中的異常處理(上)》,這裡有一個問題需要強調一下,非同步之後最好要對返回的 Task 有後續的操作, 這樣如果有異常就會及時拋出,否則會在 GC 回收資源時觸發,如果沒有設置全局異常處理,很可能會引起應用程式池的崩潰。
如果你對我的代碼感興趣,可以直接查看我的GitHub,或者關註公眾號(OSSCoder):