C#基于任务的异步模式
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#基于任务的异步模式的更多相关文章
- 基于事件的异步模式(EAP)
什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- 基于Task的异步模式的定义
返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- Event-based Asynchronous Pattern Overview基于事件的异步模式概览
https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...
- 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). 其次是 ...
- 基于事件的异步模式——BackgroundWorker
实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...
- C# 基于任务的异步模式的创建与使用的简单示例
对于窗体程序,使用基于任务的异步模式需要用到Task类,下面示例下非常简单的用法. 1.创建一个拥有异步方法的类 该类拥有一个异步方法DoSomthingAsync,根据微软建议的命名规则该方法要带A ...
随机推荐
- SpringCloud 学习网址记录
SpringCloud Gateway https://www.cnblogs.com/ityouknow/p/10141740.html 熔断降级的概念 https://blog.csdn.net/ ...
- JS检测浏览器是否最大化
function isFullScreen (){ if( window.outerHeight === screen.availHeight ){ i ...
- System.Threading.Timer如何正确地被Dispose
System.Threading.Timer是.NET中一个定时触发事件处理方法的类(本文后面简称Timer),它背后依靠的是.NET的线程池(ThreadPool),所以当Timer在短时间内触发了 ...
- Java面试准备之数据库
一.考察点 1.联结 1.1 联结的概念: 简单的说,联结是一种机制,用来在一条SELECT语句中关联表,因此称之为联结. 1.2 联结的分类 注意:联结并不代表只有使用join关键字的才算是联结,w ...
- 关于for循环与setTimeout的延迟
在for循环中使用setTimeout时,想使其每个setTimeout在上一个setTimeout的基础上进行延时,使用传入数组方式设置时间时,发现实际是按照每次设置的setTimeout的延时执行 ...
- 08-JavaScript中的函数
JavaScript中的函数 1.函数简介 函数:就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用: 将大量重复的语句写在函数里,以后需要这些语句的时候,可以直接调用函数,避免重 ...
- MySQL之 InnoDB记录结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
以下内容来自掘金小册 MySQL 是怎样运行的:从根儿上理解 MySQL 版权归原作者所有! 页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位. 指定和修改行格式的语法 ...
- 番外篇-AppService服务
一. public async Task<ListResultDto<ArchitectureDto>> GetArchitecture() { var architectur ...
- git 回退各种场景操作
在git的一般使用中,如果发现错误的将不想提交的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD <file>...,同时git add完毕之后,gi ...
- python控制台输出带颜色的文字方法
#格式: 设置颜色开始 :\033[显示方式;前景色;背景色m 注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由于表示三个参数不同含义的数值都是唯一的没有 ...