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 ...
随机推荐
- 2019-03-23 shell练习,日志统计
[2019-03-10 17:44:55]1234567 paid 10 10000 cat test.txt |tail -n +1 |sed 's/]/ ]g' |awk '{count[$3]+ ...
- Python两大佬互相撕逼 技术何苦为难技术?
最近两天 Python 圈发生了一件大事,两个 Python 大佬撕逼了起来了. 不,其实是一个大佬(刘志军)被怼. 事情是这样的. 背景 人物介绍: 董明伟:公众号「Python 之美」的作者,似乎 ...
- iOS开发基础-KVC简单介绍
一.KVC介绍 键值编码(Key Value Coding,KVC):使开发者不必进行任何操作就可以进行属性的动态读写. KVC操作方法由 NSKeyValueCoding 协议提供,而 NSObje ...
- CGPoint、CGSize、CGRect、CGRectEdge的详细使用
http://blog.sina.com.cn/s/blog_953e22700101r7lz.html 在CGGeometry.h里的 CGPoint.CGSize.CGRect.CGRectEdg ...
- 根据json生成c#实体类
vs 编辑->选择性粘贴->将json粘贴为类
- Hadoop Mapreduce分区、分组、二次排序
1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2)定制了partitioner以将map的结果送往指定reducer的过程: map - partiti ...
- 【经典数据结构】B树与B+树
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- Vue.js指令实例
v-if v-else v-show v-if 根据表达式的值的真假条件渲染元素. v-else 不需要表达式.前一兄弟元素必须有 v-if 或 v-else-if v-show 根据表达式之真假 ...
- Python——转义字符解释
转义字符 解释 ASCII值 \a 响铃 7 \b 退格 8 \f 换页 12 \n 换行 10 \r 回车 13 \t 水平制表 9 \v 垂直制表 11 \\ 一个反斜线字符 92 \' 一个单引 ...
- linux添加超级管理员用户,修改,删除用户
useradd一个用户后,去修改/etc/passwd文件中的这个用户这一行,把其中的uid改为0,gid改为0(其中****代表一个用户名)这样****就具有root权限了 如:root2:x:0: ...