C#多线程---Task实现异步
一、场景
使用Task来进行累加操作。
二、例子-Task使用
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7
8 namespace AsyncTask
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 Console.ForegroundColor = ConsoleColor.DarkGreen;
15 PrintThreadInfo("Print info in Main");
16 Console.ResetColor();
17 Console.WriteLine();
18 Task<int> myTask = new Task<int>(loop => AsyncMethod((int)loop), 10);
19 myTask.Start();
20 Console.WriteLine($"Result is: {myTask.Result}");//myTask.Result会阻塞当前调用线程
21 Console.WriteLine("Done!");
22 }
23 private static int AsyncMethod(int loopNum)
24 {
25 PrintThreadInfo("Print info in AsyncMethod");
26 int mySum = 0;
27 for(int i = 0; i < loopNum; i++)
28 {
29 mySum += i;
30 Thread.Sleep(1000);
31 }
32 return mySum;
33 }
34 private static void PrintThreadInfo(string info)
35 {
36 Console.WriteLine(info);
37 Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}\nIsBackgroundThread:{Thread.CurrentThread.IsBackground}\nIsThreadPoolThread:{Thread.CurrentThread.IsThreadPoolThread}");
38 int workerThread = 0;
39 int ioThread = 0;
40 ThreadPool.GetMaxThreads(out workerThread, out ioThread);
41 Console.WriteLine($"MaxWorkerThread:{workerThread}\nMaxIoThread:{ioThread}");
42 int workerThreadAvailable = 0;
43 int ioThreadAvailable = 0;
44 ThreadPool.GetAvailableThreads(out workerThreadAvailable, out ioThreadAvailable);
45 Console.WriteLine($"AvailableWorkerThread:{workerThreadAvailable}\nAvailableIoThread:{ioThreadAvailable}");
46 }
47 }
48 }
注:myTask.Result会阻塞当前调用线程
运行结果如下:

三、例子-Task取消
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7
8 namespace AsyncTask
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 Console.ForegroundColor = ConsoleColor.DarkGreen;
15 PrintThreadInfo("Print info in Main");
16 Console.ResetColor();
17 Console.WriteLine();
18 CancellationTokenSource cts = new CancellationTokenSource();
19 Task<int> myTask = new Task<int>(loop => AsyncMethod((int)loop,cts.Token), 10);
20 myTask.Start();
21
22 //Thread.Sleep(3000);
23 //cts.Cancel();
24 cts.CancelAfter(3 * 1000);
25 Console.WriteLine($"Result is: {myTask.Result}");//myTask.Result会阻塞当前调用线程
26 Console.WriteLine("Done!");
27 }
28 private static int AsyncMethod(int loopNum, CancellationToken ct)
29 {
30 PrintThreadInfo("Print info in AsyncMethod");
31 int mySum = 0;
32 try {
33 for (int i = 0; i < loopNum; i++)
34 {
35 ct.ThrowIfCancellationRequested();
36 mySum += i;
37 Thread.Sleep(1000);
38 }
39 }
40 catch(Exception e)
41 {
42 Console.ForegroundColor = ConsoleColor.Red;
43 Console.WriteLine("Exception type:" + e.GetType().Name);
44 Console.WriteLine("Operation is Canceled");
45 Console.ResetColor();
46 }
47 return mySum;
48 }
49 private static void PrintThreadInfo(string info)
50 {
51 Console.WriteLine(info);
52 Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}\nIsBackgroundThread:{Thread.CurrentThread.IsBackground}\nIsThreadPoolThread:{Thread.CurrentThread.IsThreadPoolThread}");
53 int workerThread = 0;
54 int ioThread = 0;
55 ThreadPool.GetMaxThreads(out workerThread, out ioThread);
56 Console.WriteLine($"MaxWorkerThread:{workerThread}\nMaxIoThread:{ioThread}");
57 int workerThreadAvailable = 0;
58 int ioThreadAvailable = 0;
59 ThreadPool.GetAvailableThreads(out workerThreadAvailable, out ioThreadAvailable);
60 Console.WriteLine($"AvailableWorkerThread:{workerThreadAvailable}\nAvailableIoThread:{ioThreadAvailable}");
61 }
62 }
63 }
运行结果如下:

四、例子-Task工厂
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6 using System.Threading.Tasks;
7
8 namespace AsyncTask
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 Console.ForegroundColor = ConsoleColor.DarkGreen;
15 PrintThreadInfo("Print info in Main");
16 Console.ResetColor();
17 Console.WriteLine();
18 CancellationTokenSource cts = new CancellationTokenSource();
19 //Task<int> myTask = new Task<int>(loop => AsyncMethod((int)loop,cts.Token), 10);
20 //myTask.Start();
21
22 Task<int> myTask = Task.Factory.StartNew(loop => AsyncMethod((int)loop, cts.Token), 10);
23
24 //Thread.Sleep(3000);
25 //cts.Cancel();
26 cts.CancelAfter(3 * 1000);
27 Console.WriteLine($"Result is: {myTask.Result}");//myTask.Result会阻塞当前调用线程
28 Console.WriteLine("Done!");
29 }
30 private static int AsyncMethod(int loopNum, CancellationToken ct)
31 {
32 PrintThreadInfo("Print info in AsyncMethod");
33 int mySum = 0;
34 try {
35 for (int i = 0; i < loopNum; i++)
36 {
37 ct.ThrowIfCancellationRequested();
38 mySum += i;
39 Thread.Sleep(1000);
40 }
41 }
42 catch(Exception e)
43 {
44 Console.ForegroundColor = ConsoleColor.Red;
45 Console.WriteLine("Exception type:" + e.GetType().Name);
46 Console.WriteLine("Operation is Canceled");
47 Console.ResetColor();
48 }
49 return mySum;
50 }
51 private static void PrintThreadInfo(string info)
52 {
53 Console.WriteLine(info);
54 Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}\nIsBackgroundThread:{Thread.CurrentThread.IsBackground}\nIsThreadPoolThread:{Thread.CurrentThread.IsThreadPoolThread}");
55 int workerThread = 0;
56 int ioThread = 0;
57 ThreadPool.GetMaxThreads(out workerThread, out ioThread);
58 Console.WriteLine($"MaxWorkerThread:{workerThread}\nMaxIoThread:{ioThread}");
59 int workerThreadAvailable = 0;
60 int ioThreadAvailable = 0;
61 ThreadPool.GetAvailableThreads(out workerThreadAvailable, out ioThreadAvailable);
62 Console.WriteLine($"AvailableWorkerThread:{workerThreadAvailable}\nAvailableIoThread:{ioThreadAvailable}");
63 }
64 }
65 }
C#多线程---Task实现异步的更多相关文章
- C# Winform 基于Task的异步与延时执行
一.Task的机制 Task位于命名空间System.Threading.Tasks中,是.NET 4.0加入的新模块,其实现机制大致类似于线程池ThreadPool,不过对于ThreadPool ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- 实现基于Task的异步模式
返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...
- 基于Task的异步模式的定义
返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- Task的异步模式
Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...
- 使用任务Task 简化异步编程
使用任务简化异步编程 Igor Ostrovsky 下载代码示例 异步编程是实现与程序其余部分并发运行的较大开销操作的一组技术. 常出现异步编程的一个领域是有图形化 UI 的程序环境:当开销较大的操作 ...
- .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)
一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...
- 异步多线程 Task理解
一.简介 Task是.NET Framework4.0 TPL(任务并行库)提供的新的操作线程池线程的封装类.它提供等待.终止(取消).返回值.完成通知.失败通知.控制执行的先后次序等优化线程操作功能 ...
随机推荐
- 高校表白App-团队冲刺第四天
今天要做什么 就如昨天所说,今天继续进行引导页制作的学习.并开始通过ViewPager做简单的布局与Activity. 遇到的问题 本来以为只是使用一个ViewPager控件就可以搞定,原来还是需要配 ...
- ES6 数值类型常用方法
ES6 数值类型常用方法 <script type="text/javascript"> // Number常用方法 /* Number.isFinite() 用来检查 ...
- IDEA上搭建spark开发
IDEA上搭建spark开发环境 我本地系统是windows10,首先IDEA上要安装了scala插件. 1.下载winutils.exe文件 winutils.exe是在Windows系统上需要的h ...
- python基础之面向对象OOP
#类(面向对象) PageObject设计模式 unittest 知识体系#函数式编程import datetimebook_info = { "title":"Pyth ...
- C实现奇偶校验
奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法.根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇数的称 ...
- JAVA,IDEA下的包机制
IDEA下的包机制 在实际开发中,大型系统往往需要多人合作完成,每个程序员都要命名多个类与接口等类型,难免会定义重复的类与接口.为了避免名字冲突,java提供了包机制只要包名不同,即使类名相同,也能相 ...
- 如何在 NetCore 中定义我们自己的JSON配置文件的管理器。
一.介绍 微软已经对外提供了新的平台,我们叫它们是 Net Core 平台,这个平台和 Net Framework 平台有本质的区别,这个最本质的区别就是微软的C#代码可以跨平台了.当前我们主流的3大 ...
- 【GCC编译器】Swing Modulo Scheduling
1. SMS 在 GCC 中的实现 1.1. 一些基本概念 (1)软流水(Software pipelining )是一种通过重叠不同迭代的指令,使其并行执行,从而改进循环中指令调度的技术.关键思想是 ...
- html页面自动跳转
<script type="javascrpit"> var url='';//需要跳转的页面 var search = window.location.search; ...
- kubernetes/k8s CRI分析-kubelet创建pod分析
先来简单回顾上一篇博客<kubernetes/k8s CRI 分析-容器运行时接口分析>的内容. 上篇博文先对 CRI 做了介绍,然后对 kubelet CRI 相关源码包括 kubele ...