using System;
using System.Threading;
using System.Threading.Tasks;
using static System.Console; //异步编程
//1.异步模式
//2.基于事件的异步模式
//3.基于任务的异步模式 namespace ConsoleApp
{
class Program
{
public static void TaskMethod(object o)
{
Log(o?.ToString());
} private static object s_logLock = new object(); public static void Log(string title)
{
lock (s_logLock)
{
WriteLine(title);
WriteLine($"TaskID:{Task.CurrentId?.ToString() ?? "no task"}, " +
$"thread:{Thread.CurrentThread.ManagedThreadId}");
WriteLine($"is background thread: {Thread.CurrentThread.IsBackground}");
WriteLine();
}
} static void Main(string[] args)
{
//StartNew和Run会立即启动
//方法1
var tf = new TaskFactory();
Task t1 = tf.StartNew(TaskMethod, "using a task factory"); //方法2
Task t2 = Task.Factory.StartNew(TaskMethod, "factory via task"); //方法3
var t3 = new Task(TaskMethod, "using a task constructor and Start");
t3.Start(); //方法4
Task t4 = Task.Run(() => TaskMethod("using the Run method")); t1.Wait();
t2.Wait();
t3.Wait();
t4.Wait(); //主线程没有任务ID,也不是线程池中的线程
TaskMethod("main thread");
var t5 = new Task(TaskMethod, "run sync");
//会使用相同的线程作为主调线程
t5.RunSynchronously(); //如果任务的代码长时间运行,就应该使用TaskCreationOptions.LongRunning
//即告诉任务调度器创建一个新的线程,而不使用线程池中的线程
var t6 = new Task(TaskMethod, "long running",
TaskCreationOptions.LongRunning);
t6.Start(); //任务结果 future
//使用泛型Task<TResult>
var t7 = new Task<Tuple<int, int>>(TaskWithResult, Tuple.Create(, ));
t7.Start();
WriteLine(t7.Result);
t7.Wait();
WriteLine($"result from task: {t7.Result.Item1} {t7.Result.Item2}"); //连续的任务
//一个要使用前一个任务的结果,如果前一个失败了,这个任务就应该执行一些清理工作
//无论前一个任务是如何结束的,后面的任务都会接着启动
Task t8 = new Task(DoOnFirst);
Task t9 = t8.ContinueWith(DoOnSecond);
Task t10 = t8.ContinueWith(DoOnSecond);
Task t11 = t9.ContinueWith(DoOnSecond);
t8.Start();
//出错时启动
Task t12 = t8.ContinueWith(DoOnSecond, TaskContinuationOptions.OnlyOnFaulted); Task.WaitAll(t8, t9, t10, t11); //任务取消
CancelTask(); ReadKey();
} public static Tuple<int, int> TaskWithResult(object divsion)
{
if (divsion is Tuple<int, int>)
{
Tuple<int, int> div = (Tuple<int, int>)divsion;
int result = div.Item1 / div.Item2;
int reminder = div.Item1 % div.Item2;
WriteLine("task creates a result...");
return Tuple.Create(result, reminder);
}
return null;
} private static void DoOnFirst()
{
WriteLine($"doing some task {Task.CurrentId}");
Task.Delay().Wait();
} private static void DoOnSecond(Task t)
{
WriteLine($"task {t.Id} finished");
WriteLine($"this task id {Task.CurrentId}");
WriteLine("do some cleanup");
Task.Delay().Wait();
} public static void CancelTask()
{
var cts = new CancellationTokenSource();
//注册一个将在取消此CancellationToken时调用的委托。
cts.Token.Register(() => WriteLine("*** task canceled"));
//在指定的毫秒数后计划对此CancellationTokenSource 的取消操作。
cts.CancelAfter();
//cts.Cancel();//立即取消 Task t1 = Task.Run(() =>
{
WriteLine("in task");
while (true)
{
Task.Delay().Wait();
CancellationToken token = cts.Token;
if (token.IsCancellationRequested)
{
WriteLine("canceling was requested, " +
"canceling from within the task");
token.ThrowIfCancellationRequested();
break;
}
WriteLine("in loop");
Task.Yield();
}
WriteLine("task finished without cancellation"); }, cts.Token); try
{
t1.Wait();
}
catch(AggregateException ex)
{
WriteLine($"exception: {ex.GetType().Name}, {ex.Message}");
foreach(var innerException in ex.InnerExceptions)
{
WriteLine($"inner exception: {ex.InnerException.GetType()}," +
$"{ex.InnerException.Message}");
}
} }
}
}

C#基于任务的异步模式的更多相关文章

  1. 基于事件的异步模式(EAP)

    什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...

  2. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  3. 实现基于Task的异步模式

    返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...

  4. 基于Task的异步模式的定义

    返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...

  5. 基于Task的异步模式--全面介绍

    今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...

  6. Event-based Asynchronous Pattern Overview基于事件的异步模式概览

    https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...

  7. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  8. 基于事件的异步模式——BackgroundWorker

    实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...

  9. C# 基于任务的异步模式的创建与使用的简单示例

    对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法. 1.创建一个拥有异步方法的类 该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带A ...

随机推荐

  1. SpringIOC和AOP简单概述

    Spring学习:主要学习两大块IOC   AOP 一.IOC   IOC:控制反转(也可以叫做依赖注入)的基本认识:   当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时 ...

  2. 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(配置保存数据的数据库)

    配置信息如下:这是我的python软件和APP软件默认连接的配置 数据库名称:iot        编码utf8 表格名字:historicaldata 字段 id      自增,主键 date   ...

  3. GXOI/GZOI2019题解

    GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...

  4. java常识

    什么是java语言? java语言是美国Sun公司,在1995年推出的高级编程语言.所谓编程语言,是计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能. java语言发展历 ...

  5. Kubernetes — 重新认识Docker容器

    这一次,我要用+Docker+部署一个用+Python+编写的+Web+应用.这个应用的代码部分(app.py)非常简单: from flask import Flask import socket ...

  6. JS中的块级作用域,var、let、const三者的区别

    1. 块作用域{ } <script type="text/javascript"> { var a = 1; console.log(a); // 1 } conso ...

  7. 第四章· Redis的事务、锁及管理命令

    一.事务介绍 二.Redis乐观锁介绍 三.Redis管理命令 一.事务介绍 Redis的事务与关系型数据库中的事务区别 1)在MySQL中讲过的事务,具有A.C.I.D四个特性 Atomic(原子性 ...

  8. SpringMVC学习手册(三)------EL和JSTL(上)

    1.含义 EL:       Expression Language , 表达式语言 JSTL:   Java Server Pages Standard Tag Library, JSP标准标签库  ...

  9. centos7之NFS使用

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 一.nfs为什么需要RPC? 因为NFS支持的功能很多,不同 ...

  10. EventBus 线程切换原理

    主要问题其实只有两个,其一:如何判断当前发送事件的线程是否是主线程:其二:如何在接收事件时指定线程并执行: 一个一个来看. 1.如何判断是否在主线程发送 EventBus在初始化的时候会初始化一个Ma ...