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 }
View Code
注: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 }
View Code
运行结果如下:
四、例子-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 }
View Code
转载于:https://www.cnblogs.com/3xiaolonglong/p/9639864.html
C#多线程---Task实现异步相关推荐
- 响应式编程(反应式编程)的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)
响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 文章目录 响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 简介 1. 示例 2. 同步编程 3. 多线程编程 ...
- Android多线程和常用异步处理技术
Android多线程和常用异步处理技术 一.Android多线程概述 1.概述:表示一个程序的多段语句同时执行,但并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待. 2.线程和进 ...
- 过程 线 多线程 并发 同步异步
过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...
- 3D引擎多线程:资源异步加载
本文原创版权归 博客园 flagship 所有,如有转载,请详细标明作者及原文出处,以示尊重! 作者:flagship 原文:3D引擎多线程:资源异步加载 资源异步加载恐怕是3D引擎中应用最为广泛的多 ...
- Android中的多线程编程与异步处理
Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...
- 使用多线程+easyexcel实现异步号码导入
使用多线程+easyexcel实现异步号码导入 需求 最近项目需要实现excel文件上传批量导入号码 实现 通过多线程+easyexcel的方式实战一手.不多说,上代码,欢迎各位大佬指正. 环境 sp ...
- C++多线程:package_task异步调用任何目标执行操作
文章目录 描述 函数成员及使用 总结 我们上一篇描述关于C++多线程中的异步操作相关库( async和 promise),本节将分享c++标准库中最后一个多线程异步操作库 package_task的学 ...
- 多线程-Task、await/async
Task创建无返回值 Task是.netframwork4.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚 ...
- C++ concurrency::task实现异步编程(Windows)
最近一直在看js.python.lua等脚本语言的异步编程,今天脑子一热突然想看看C++能否也有支持异步的相关类库,上网一搜还真的有 microsoft官方文档https://msdn.microso ...
最新文章
- 计算机网络的寻址问题ARP协议(Mac地址 ip地址)
- 【原创】jQuery1.8.2源码解析之jQuery.event
- 无线网络连接无法停用
- SAP Commerce Cloud Spartacus UI 的 ActionClass 数据结构设计
- C++学习之路 | PTA乙级—— 1032 挖掘机技术哪家强 (20 分)(精简)
- java i/o 流详解_java I/O流详解
- AI(artificial intelligence)的学习
- 虚拟货币公有链项目集体爆发,AE超过历史最高点
- (cljs/run-at (JSVM. :browser) 简单类型可不简单啊~)
- Latex调节目录间距\tableofcontents
- C语言中变量的静态分配(Static)和动态分配(StackHeap)
- python apkg_python解包wxapkg_GitHub - python6460/wxappUnpacker: Wechat App(微信小程序,.wxapkg)解包及相关...
- android 文件下载
- 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
- 关于CSDN书写的博客内容中图片不显示的问题
- SendGrid -- Stressful Subject
- canvas画不规则图形
- CF1526C2 Potions (Hard Version) (贪心 + 线段树)
- html 页面新窗口打开,HTML 在新窗口打开全站链接
- 1.3.随机变量,随机向量的自相关与自协方差
热门文章
- 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
- [剑指Offer]5.二维数组中的查找
- 六大重点工程构筑兰州大数据产业
- Javascript之链式运动框架1
- Rectangular inference 矩形推理
- android切换字体颜色,Android开发实现按钮点击切换背景并修改文字颜色的方法
- python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加
- 从源码分析DEARGUI之add_drag_float和4
- 若使用numba.cuda.jit加速pytorch训练代码会怎样
- ES6-let const