OSS.Social微信项目标准库介绍

  经过本周的努力,昨晚终于完成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):

时间: 2024-10-12 05:36:44

OSS.Social微信项目标准库介绍的相关文章

开源OSS.Social微信项目进阶介绍

在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,主要在讲述解决思路和过程,没有详细实现和使用介绍.本着不能马虎的态度,这篇文章我来给大家分解一下项目结构,使用方式以及后边的规划,希望能够让大家通达晓畅.同时,当前项目正在进行 .Net Standard 类库的过渡,相信一段时间之后就可以同时对 .net framework 和 .net core 提供支持. 这个项目是整个OSS系列开源项目之一,主要是对 社交化产品的接口包装,而微信项目是当前正在进行

走进C++程序世界------IO标准库介绍

流概述 流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序员就可以使用它,流将负责处理所有的细节. IO类库 在C++输入?输出操作是通过C++系统提供的完成I/O操作的一组类实现的.主要包括: 标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流 文件流类:处理与磁盘文件关联的数据流 字符串流类:利用内存中的字符数组处理数据的输入输出 异常类等:处理异常错误. 标准IO对象: 包含iostream类的C++程序启动时,将

标C编程笔记day07 常用标准库介绍、字符串输入处理、字符指针的使用

常用标准库: assert.h:断言,包含assert宏.可以进行自我检查 ctype.h:字符处理,字符的分类,大小转换 errno.h:错误信息处理 float.h:浮点数特性 limits.h:整数的大小,提供了描述整数类型的宏 lcale.h:本地化 math.h:数学函数 setjmp.h:跳转 signal.h:信号处理 stdarg.h:可变长参数处理 stddef.h:经常使用的类型的定义 stdio.h:输入输出 string.h:字符串处理 stdlib.h:其他函数,字符串

Python标准库介绍

在<Python语言参考手册>中描述了Python的语法和语义,而本手册主要介绍了Python标准库的内容和使用,也介绍了一些发行库里可选的组件库. Python标准库包含的内容是非常广泛的,通过标准库的目录长度和内容就可明白到这一点.标准库包含一些模块是使用C语言来编写的,比如访问系统I/O的文件功能,这些功能对Python开发人员来说是不能直接访问的,因此这些模块都设计成为内置模块.另外标准库也为开发人员提供那些大家经常使用的功能,这样以便成为标准的解决方案,就可以提高开发人员的开发速度和

C++的iostream标准库介绍(转自http://dev.yesky.com/420/2525920.shtml)

为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用. iostream为内置类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通过对iostream库的扩展,来支持自定义类型的输入输出操作. 为什么说要扩展才能提供支持呢?我们来一个示例. #inc

Robot framework(RF) Builti,Screenshot和Collections标准库介绍

1.1  Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一样的写测试用例的方式.但它却有着像编程语言一样的强大的关键字,以及可以开发关键字的扩展能力. Builti标准类库包含了很多最常用的关键字,下面就逐一介绍常用关键字的使用. 3.7.1 log 关键字 log 关键字就是编程语言里的“print”一样,可以打印任何你想打印的内容. 在log关键字测试

python标准库介绍——35 pipes 模块详解

==pipes 模块== (只用于 Unix) ``pipes`` 模块提供了 "转换管道 (conversion pipelines)" 的支持. 你可以创建包含许多外部工具调用的管道来处理多个文件. 如 [Example 3-8 #eg-3-8] 所示. ====Example 3-8. 使用 pipes 模块====[eg-3-8] ``` File: pipes-example-1.py import pipes t = pipes.Template() # create a

python标准库介绍——34 commands 模块详解

==commands 模块== (只用于 Unix) ``commands`` 模块包含一些用于执行外部命令的函数. [Example 3-7 #eg-3-7] 展示了这个模块. ====Example 3-7. 使用 commands 模块====[eg-3-7] ``` File: commands-example-1.py import commands stat, output = commands.getstatusoutput("ls -lR") print "s

python标准库介绍——31 threading 模块详解

threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``thread`` 模块相同, 只有你在编译解释器时打开了线程支持才可以使用它 . 你只需要继承 //Thread// 类, 定义好 ``run`` 方法, 就可以创建一 个新的线程. 使用时首先创建该类的一个或多个实例, 然后调用 ``start`` 方法. 这样每个实例的 ``run`` 方法都会运