您的位置:首页 > 编程语言 > C#

[C#] 走进异步编程的世界 - 剖析异步方法(上)

2016-09-12 09:24 381 查看

走进异步编程的世界 - 剖析异步方法(上)

  这是上篇《走进异步编程的世界 - 开始接触 async/await 异步编程》(入门)的第二章内容,主要是与大家共同深入探讨下异步方法。

  本文要求了解委托的使用。

目录

介绍异步方法

控制流

await 表达式

How 取消异步操作

介绍异步方法

异步方法:在执行完成前立即返回调用方法,在调用方法继续执行的过程中完成任务。
语法分析:
(1)关键字:方法头使用 async 修饰。
(2)要求:包含 N(N>0) 个 await 表达式(不存在 await 表达式的话 IDE 会发出警告),表示需要异步执行的任务。【备注】感谢 czcz1024 的修正与补充:没有的话,就和普通方法一样执行了。
(3)返回类型:只能返回 3 种类型(void、Task 和 Task<T>)。Task 和 Task<T> 标识返回的对象会在将来完成工作,表示调用方法和异步方法可以继续执行。
(4)参数:数量不限。但不能使用 out 和 ref 关键字。
(5)命名约定:方法后缀名应以 Async 结尾。
(6)其它:匿名方法和 Lambda 表达式也可以作为异步对象;async 是一个上下文关键字;关键字 async 必须在返回类型前。

internal class Program
{
private static void Main(string[] args)
{
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;

var t = Do.ExecuteAsync(token);

//Thread.Sleep(3000);   //挂起 3 秒
//source.Cancel();    //传达取消请求

t.Wait(token);  //等待任务执行完成
Console.WriteLine($"{nameof(token.IsCancellationRequested)}: {token.IsCancellationRequested}");

Console.Read();
}

}

internal class Do
{
/// <summary>
/// 异步执行
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static async Task ExecuteAsync(CancellationToken token)
{
if (token.IsCancellationRequested)
{
return;
}

await Task.Run(() => CircleOutput(token), token);
}

/// <summary>
/// 循环输出
/// </summary>
/// <param name="token"></param>
private static void CircleOutput(CancellationToken token)
{
Console.WriteLine($"{nameof(CircleOutput)} 方法开始调用:");

const int num = 5;
for (var i = 0; i < num; i++)
{
if (token.IsCancellationRequested)  //监控 CancellationToken
{
return;
}

Console.WriteLine($"{i + 1}/{num} 完成");
Thread.Sleep(1000);
}
}
}


View Code



图3-1



图3-2 注释两行代码



图3-3:图3-1和图3-2的执行结果(注释两行代码)

  上图是不调用 Cancel() 方法的结果图,不会取消任务的执行。

  下图在 3 秒后调用 Cancel() 方法取消任务的执行:



图3-4:去掉注释





图3-5:图3-1和图3-4的执行结果(去掉注释)

小结

介绍异步方法的语法、三种不同的返回值类型(void、Task 和 Task<T>)和控制流程等。

简单常用的异步执行方式:Task.Run()。【注意】它是在不同的线程上执行方法。

如何取消异步操作。

传送门

  入门:《开始接触 async/await 异步编程

  补充篇:《走进异步编程的世界 - 剖析异步方法(下)

  GUI 篇:《走进异步编程的世界 - 在 GUI 中执行异步操作

原文链接:http://www.cnblogs.com/liqingwen/p/5844095.html

【参考】《Illustrated C# 2012》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: