OSS.Social微信項目標準庫介紹 完成OSS.Http底層HttpClient重構封裝

  經過本週的努力,昨晚終於完成OSS.Social微信項目的標準庫支持,當前項目你已經可以同時在.net framework和.net core 中進行調用,調用方法也發生了部分變化,這裏我簡單分享下,主要包含下邊幾個部分:

· 移植後的變化

· OSS.CommonOSS.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.CommonOSS.Http關係

  OSS.CommonOSS.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):

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章