一、场景

使用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. 响应式编程(反应式编程)的来龙去脉(同步编程、多线程编程、异步编程再到响应式编程)

    响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 文章目录 响应式编程的来龙去脉(同步编程.多线程编程.异步编程再到响应式编程) 简介 1. 示例 2. 同步编程 3. 多线程编程 ...

  2. Android多线程和常用异步处理技术

    Android多线程和常用异步处理技术 一.Android多线程概述 1.概述:表示一个程序的多段语句同时执行,但并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待. 2.线程和进 ...

  3. 过程 线 多线程 并发 同步异步

    过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...

  4. 3D引擎多线程:资源异步加载

    本文原创版权归 博客园 flagship 所有,如有转载,请详细标明作者及原文出处,以示尊重! 作者:flagship 原文:3D引擎多线程:资源异步加载 资源异步加载恐怕是3D引擎中应用最为广泛的多 ...

  5. Android中的多线程编程与异步处理

    Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...

  6. 使用多线程+easyexcel实现异步号码导入

    使用多线程+easyexcel实现异步号码导入 需求 最近项目需要实现excel文件上传批量导入号码 实现 通过多线程+easyexcel的方式实战一手.不多说,上代码,欢迎各位大佬指正. 环境 sp ...

  7. C++多线程:package_task异步调用任何目标执行操作

    文章目录 描述 函数成员及使用 总结 我们上一篇描述关于C++多线程中的异步操作相关库( async和 promise),本节将分享c++标准库中最后一个多线程异步操作库 package_task的学 ...

  8. 多线程-Task、await/async

    Task创建无返回值 Task是.netframwork4.0重新分装的多线程类.原因以前的多线程(thread threadpool)不好用.(.net framwork也是的发展的,现在的EF,刚 ...

  9. C++ concurrency::task实现异步编程(Windows)

    最近一直在看js.python.lua等脚本语言的异步编程,今天脑子一热突然想看看C++能否也有支持异步的相关类库,上网一搜还真的有 microsoft官方文档https://msdn.microso ...

最新文章

  1. 计算机网络的寻址问题ARP协议(Mac地址 ip地址)
  2. 【原创】jQuery1.8.2源码解析之jQuery.event
  3. 无线网络连接无法停用
  4. SAP Commerce Cloud Spartacus UI 的 ActionClass 数据结构设计
  5. C++学习之路 | PTA乙级—— 1032 挖掘机技术哪家强 (20 分)(精简)
  6. java i/o 流详解_java I/O流详解
  7. AI(artificial intelligence)的学习
  8. 虚拟货币公有链项目集体爆发,AE超过历史最高点
  9. (cljs/run-at (JSVM. :browser) 简单类型可不简单啊~)
  10. Latex调节目录间距\tableofcontents
  11. C语言中变量的静态分配(Static)和动态分配(StackHeap)
  12. python apkg_python解包wxapkg_GitHub - python6460/wxappUnpacker: Wechat App(微信小程序,.wxapkg)解包及相关...
  13. android 文件下载
  14. 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
  15. 关于CSDN书写的博客内容中图片不显示的问题
  16. SendGrid -- Stressful Subject
  17. canvas画不规则图形
  18. CF1526C2 Potions (Hard Version) (贪心 + 线段树)
  19. html 页面新窗口打开,HTML 在新窗口打开全站链接
  20. 1.3.随机变量,随机向量的自相关与自协方差

热门文章

  1. 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
  2. [剑指Offer]5.二维数组中的查找
  3. 六大重点工程构筑兰州大数据产业
  4. Javascript之链式运动框架1
  5. Rectangular inference 矩形推理
  6. android切换字体颜色,Android开发实现按钮点击切换背景并修改文字颜色的方法
  7. python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加
  8. 从源码分析DEARGUI之add_drag_float和4
  9. 若使用numba.cuda.jit加速pytorch训练代码会怎样
  10. ES6-let const