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

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

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

    在开源OSS.Social微信项目解析的随笔中,我简单给大家分享了进行中微信项目的概要设计,主要在讲述解决思路和过程,没有详细实现和使用介绍.本着不能马虎的态度,这篇文章我来给大家分解一下项目结构,使 ...

  2. 开源OSS.Social微信项目解析

    ​前言:OSS.Social是个开源的社交网站接口集成项目,当前也有很多其他不错的项目,不过始终没有我想要的那种简单清晰,只能撸起袖子,从头打造一个.当前正在进行的是对微信项目的开发,这里把对接口的整 ...

  3. Python的标准库介绍与常用的第三方库

    Python的标准库介绍与常用的第三方库 Python的标准库: datetime:为日期和时间的处理提供了简单和复杂的方法. zlib:以下模块直接支持通用的数据打包和压缩格式:zlib,gzip, ...

  4. 《挑战30天C++入门极限》C++的iostream标准库介绍(3)

        C++的iostream标准库介绍(3) C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出. 1.有流对象的成员函 ...

  5. 《挑战30天C++入门极限》C++的iostream标准库介绍(2)

        C++的iostream标准库介绍(2) 接下来我们继续看一下C++风格的串流控制,C++引入了ostringstream.istringstream.stringstream这三个类,要使用 ...

  6. 《挑战30天C++入门极限》C++的iostream标准库介绍(1)

        C++的iostream标准库介绍(1) 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同 ...

  7. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...

  8. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是 ...

  9. python标准库介绍——27 random 模块详解

    ==random 模块== "Anyone who considers arithmetical methods of producing random digits is, of cour ...

随机推荐

  1. getElementsByTagName("div")和$("div")区别

    作者:zccst <body> <div class="selected">1</div> <div class="select ...

  2. IOS数据库FMDB增、删、改、查的使用【原创】

    http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...

  3. Codeforces 242E:XOR on Segment(位上的线段树)

    http://codeforces.com/problemset/problem/242/E 题意:给出初始n个数,还有m个操作,操作一种是区间求和,一种是区间xor x. 思路:昨天比赛出的一道类似 ...

  4. 简单介绍java Enumeration

    Enumeration接口 Enumeration接口本身不是一个数据结构.但是,对其他数据结构非常重要. Enumeration接口定义了从一个数据结构得到连续数据的手段.例如,Enumeratio ...

  5. C# .NET修改注册表

    c#修改注册表,需要引用Microsoft.Win32命名空间 using Microsoft.Win32; //声明 ///引用 RegistryKey reg; reg = Registry.Cl ...

  6. HDU 1813 Escape from Tetris

    TMDTMD IDA*没跑了.什么是IDA*? 就是迭代深搜+A*估个价. 然而为什么调了一天? n<=2的时候我输出了东西.... 看了一天. #include<iostream> ...

  7. [Angular Tutorial] 11 -Custom Filters

    在这一步中您将学到如何创建您自己的展示过滤器. ·在先前的步骤中,细节页面展示“true”或“false”来显示某部电话是否有某项功能.在这一步中,我们将使用自定义的过滤器来将这些个字符串转化成符号: ...

  8. iOS 之 调试、解决BUG

    iOS 解决一个复杂bug 之 计分卡 iOS 调试 之 打印 iOS 错误之 NSObject .CGFloat iOS bug 之 H5 页面没有弹出提示框 iOS 日志工具 CocoaLumbe ...

  9. Hibernate详细教程

    一.搭建Hibernate环境 1.在src目录下创建hibernate.cfg.xml配置文件 PS:文件的名字不能改! <?xml version="1.0" encod ...

  10. KMP算法之查找模式串在源串中出现的次数

    问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题 ...