异步编程

异步代码在等待I/O请求响应的同时,可通过生成更多的线程,处理更多的请求

异步代码在等待I/O请求的同时,可生成UI交互线程,并通过将耗时的工作转移到其他CPU内核的方式,让UI的响应速度更快

System.Threading.Tasks命名空间中的Task和Task类型,使用单个方法表示异步操作

Action和Func委托

委托的作用是封装一个方法,在TAP中用委托表示以异步方式执行的工作


Action委托和Func委托唯一的区别就是Func委托必须有一个返回值

委托的基本使用

private static void ShowMessage(String message){Console.log(message);
}
...
...
Action<string> a = ShowMessage;
a("OK");

委托的简化写法

Action<string> a = (s) => Console.WriteLine(s);
a("OK");

Lambda表达式 主要用于简化委托的代码编写形式。当函数语句较少,而有需要用委托来调用时,使用Lambda表达式比较方便

格式: (输入参数列表)=> (表达式或语句块)

x => x * x
(x,y) => x == y
(int x, string s) => s.length > x
() => SomeMethod()

异步操作关键字

Async await

async只能用于方法或者事件处理程序的签名中,作用是将当前方法声明为异步方法
如果方法没有返回值,则用async和Task共同签名
如果方法有返回值,则用async和Task共同签名

private void Method1(){...} // 普通方法(没有返回值)
private async Task Method1Async() {...} //异步方法(没有返回值)private int Method2(){...} //普通方法(返回值)
private async Task<int> Method2Async(){...} //异步方法(有返回值)private void Btn_click(...){...} //普通的事件处理程序
private async void Btn1_click(...){...} // 异步事件处理程序

await运算符
await是一个运算符,可将其用在表达式中,该运算符表示等待异步执行的结果,必须放在异步方法的内部
await运算符和同步编程最大的区别是:异步等待任务完成时,既不会继续执行后边的代码,也不会影响用户对UI界面的操作

private async void Btn_click(..)
{Task a = Method1Async(); //创建任务aawait a; // 等待任务a完成, 任务完成前不会执行该语句后面的代码,但也不会影响界面操作Task<int> b = Method2Async(); //创建任务bint x = await b; // 等待任务b完成,任务b完成前不会执行该语句后面的代码,也不会影响界面操作
}
private async Task Method1Async(){...}
private async Task<int> Method2Async(){...}

如果用异步方法实现,必须用async和Task共同表示没有返回值的任务,用async和Task共同表示返回值为TResult类型的任务
默认情况下,仅包含async和await的方法不会创建新线程,它只是表示在当前线程中,异步执行指定的任务

执行和取消异步任务

利用Task.Run执行异步任务
给普通方法加上Task.Run外壳就可以执行异步任务

private async void MainMethod(..)
{await Task.Run(() => Method1());  // 任意的Lamabda都可以转化为委托int result = await Task.Run(() => Method2());Console.WriteLine("Main Thread ID:{0}", Thread.CurrentThread.ManagesThreadid);
}
public void Method1(){Console.WriteLine("Method1 Thread ID{0}",Thread.CurrentThread.ManagesThreadid);}
public void Method2(){Console.WriteLine("Method2 Thread ID{0}",Thread.CurrentThread.ManagesThreadid);}

给匿名方法加上Task.Run外壳也可以执行异步任务

private async void btn_click(...)
{await Task.Run(() => {...}); // 匿名问题
}

Task类的Run方法表示使用默认的任务调度程序在线程池中通过后台执行指定的任务
Task.Run方法会在线程池中执行任务,而不是在所在线程执行任务(上上面的代码示例说明此项)

异步任务的取消和终止
Run方法的重载形式
Run(Action, CancellationToken)
Run(Func, CancellationToken(取消令牌))

在命名空间System.Threading下
CancellationTokenSource用于创建取消通知,称为取消源
CancellationToken结构用于传播应取消操作的通知,称为取消令牌
取消源的Cancel方法会将每个令牌上的IsCancellationRequested属性都设置为true,进而终止任务的进行

CancellationTokenSource cts = new CancellationTokenSource ();// 创建取消源对象
CancellationToken ct = cts.Token; // 将取消源的token属性赋值给取消令牌ct
...
Task.Run(() => Method1(),ct); //将run方法的第二个参数设置为取消令牌ct
...
cts,Cancel(); //调用Cancel方法发出取消命令

WCF入门

WCF特点:
以服务为中心
支持多种消息交换模式
支持多种传输协议
支持工作流,事务以及持久性的消息处理
统一性,安全性和可扩展性

服务的三要素
地址 Address 意味着在哪里(也含有传输方式信息)
绑定 Binding 意味着怎么做(与地址的传输方式要匹配)
协议 Contract 意味着做什么(服务协定)

常用的协定有服务协定(ServiceContract数据协定(DataContract)

服务协定是指WCF对客户端公开哪些服务,WCF服务端通过服务协定向客户端公开以下内容:
操作方法 消息交换模式 采用的通信协议以及序列化格式

服务协定包括ServiceContract特性和OperationContract特性

ServiceContract特性用于在应用程序中定义服务协定
OperationContract特性用于在应用程序中定义操作协定
一个服务中可以有多个操作

例如

[ServiceContract]
public interface IService1
{[OperationContract]double Add(double n1, double n2);
}
// 这段代码对IService1接口用ServiceContract特性声明了服务协定,对Add方法用OperationContract特性声明了操作协定
// 编译器编译这段代码时,遇到ServiceContract特性声明,它就会自动创建ServiceContractAttribute类的一个实例,并通过该实例处理IService1接口

数据协定是服务端与客户端之间交换数据的约定,即用某种抽象方式描述要交换的数据并将其传输到客户端(定义了哪些变量可以让客户端调用,哪些不行)
数据协定默认采用XML格式

数据协定利用DataContract特定和DataMember特性声明
DataContract特定定义哪些类可以被序列化
DataMember特性用于声明类中哪些成员可以被序列化

C#-异步编程及WCF入门相关推荐

  1. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  2. python2异步编程_python异步编程入门

    这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...

  3. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些

    Java编程开发好入门吗?消息队列的用途有哪些?消息队列是指能够提供消息排队消费功能的软件程序,是消息队列中间件的一部分.消息队列中间件是分布式系统中重要的组件.接下来就给大家讲解消息队列的优势.类型 ...

  4. Python异步编程实战入门:从概念到实战

    概述 读者可前往我的博客获得更好的阅读体验 在Python中存在GIL机制,该机制保证了在Python中同时间内仅能运行一行代码,这导致了Python无法真正实现多线程,但可以通过多进程打破GIL限制 ...

  5. python2异步编程_Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  6. python编程入门-Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  7. C/C++编程:异步编程入门

    背景 在产品端开发软件多了,免不了遇到多线程处理的情况,这也符合多核.异构的现代化硬件发展的需求.多线程处理中常见的有两种应用情形: 并行化算法处理.利用OpenMP/TBB等CPU并行库,或者CUD ...

  8. python程序设计-Python 异步编程入门

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  9. python异步教程_【Python 异步编程入门】

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

最新文章

  1. 相机模型--Catadioptric Omnidirectional Camera
  2. Git和Repo管理使用简要介绍
  3. 19、SQL Server 数据修改之Insert into
  4. Spring Boot(十七):使用Spring Boot上传文件
  5. c++实现单例类(懒汉与饿汉)
  6. 关于SAP Kyma在国内的落地情况
  7. (二叉树存储+递归遍历)Binary Tree Traversals
  8. 2019西安交通大学计算机复试,2019年西安交通大学复试分数线
  9. mysql memory优点_MySQL Memory存储引擎:优势及性能测试
  10. MySQL数据库的终结_python中数据库的操作终结
  11. 本机未装Oracle数据库时Navicat for Oracle 报错:Cannot create oci environment 原因分析及解决方案
  12. Lesson 10.1Lesson 10.2 开篇:超参数优化与枚举网格搜索的理论极限随机网格搜索
  13. 芯鼎盛LED恒流驱动芯片TX6128设计的DC-DC开关电源降压恒流DEMO说明
  14. java中的if语句_java中的条件判断语句
  15. 计算机复试读研规划,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...
  16. 高级数据结构——AVL树
  17. (纪录片)光的故事 BBC Light Fantastic (2004)
  18. 根据经纬度调用Google地图显示对应位置
  19. Fone Keeper Mac版,帮你轻松恢复iOS数据
  20. 毛桃pe系统 linux,老毛桃U盘PE重装教程

热门文章

  1. SQL_ODPS-MaxCompute-odpscmd-1.0
  2. Crypto Legends新赛季改动需知
  3. 以证券交易所开户的具体步骤
  4. JAVA计算应缴住房基金,以支取住房基金方式怎样汇缴公积金
  5. unity发布审核:调用苹果禁用的热更新框架或api: [wax]
  6. 《思科绿色数据中心建设与管理》——1.4 绿色阻力
  7. 使用JAF创建MIME消息
  8. 查找导致Simulink仿真缓慢的原因
  9. thinkphp youdian cms 实际操作 常用变量输出
  10. POJ1716-Integer Intervals