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 ...
随机推荐
- http协议进阶(五)连接管理
几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机网络设备都在使用的一种分组交换网络分层协议集. 它的特点是只要连接建立,客户端与服务器之间的报文交换就永远不会丢失.受损或失序. ...
- nginx加密,访问接口认证
使用htpasswd加密做接口认证 首先,安装htpasswd: yum install -y httpd-tools mkdir -p /usr/local/src/nginx/ 设置用户以及密码: ...
- 5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用
本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频 ...
- JS 设计模式三 -- 策略模式
策略模式 概念 定义一系列算法,把它们一个个封装起来. 将算法的使用与算法的实现分离开来 实现 // 加权映射关系 var levelMap = { S: 10, A: 8, B: 6, C: 4 } ...
- OracleSql语句学习(四)
SELECT e.ename,m.ename,d.locFROM emp_weiyiji e JOIN emp_weiyiji m ON e.mgr=m.empnoJOIN dept_weiyiji ...
- 【翻译】asp.net core中使用MediatR
这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作 ...
- [转帖]Scanners-Box 指引
作者:杨文链接:https://zhuanlan.zhihu.com/p/26534414来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 原文地址:We5ter/Sca ...
- Unit 6.标准文档流,浮动,清除浮动以及margin塌陷问题
一. 什么是标准文档流 文本流其实就是文档的读取和输出顺序,也就是我们通常看到的由左到右.由上而下的读取和输出形式,在网页中每个元素都是按照这个顺序进行排序和显示的,而float和position两个 ...
- css实现多行文本溢出显示省略号(…)
WebKit浏览器或移动端的页面在WebKit浏览器或移动端(绝大部分是WebKit内核的浏览器)的页面实现比较简单,可以直接使用WebKit的CSS扩展属性(WebKit是私有属性)-webkit- ...
- Flask插件wtforms、Flask文件上传和Echarts柱状图
一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...