C#-异步编程及WCF入门

异步编程

异步代码在等待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(); //创建任务a
	await a; // 等待任务a完成, 任务完成前不会执行该语句后面的代码,但也不会影响界面操作
	Task<int> b = Method2Async(); //创建任务b
	int 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特性用于声明类中哪些成员可以被序列化

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值