一、场景

使用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实现异步的更多相关文章

  1. C# Winform 基于Task的异步与延时执行

    一.Task的机制   Task位于命名空间System.Threading.Tasks中,是.NET 4.0加入的新模块,其实现机制大致类似于线程池ThreadPool,不过对于ThreadPool ...

  2. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  3. 实现基于Task的异步模式

    返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编 ...

  4. 基于Task的异步模式的定义

    返回该系列目录<基于Task的异步模式--全面介绍> 命名,参数和返回类型 在TAP(Task-based Asynchronous Pattern)中的异步操作的启动和完成是通过一个单独 ...

  5. 基于Task的异步模式--全面介绍

    今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...

  6. Task的异步模式

    Task的异步模式 返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的 ...

  7. 使用任务Task 简化异步编程

    使用任务简化异步编程 Igor Ostrovsky 下载代码示例 异步编程是实现与程序其余部分并发运行的较大开销操作的一组技术. 常出现异步编程的一个领域是有图形化 UI 的程序环境:当开销较大的操作 ...

  8. .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)

    一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...

  9. 异步多线程 Task理解

    一.简介 Task是.NET Framework4.0 TPL(任务并行库)提供的新的操作线程池线程的封装类.它提供等待.终止(取消).返回值.完成通知.失败通知.控制执行的先后次序等优化线程操作功能 ...

随机推荐

  1. C语言:sizeof判断数据类型长度

    #include <stdio.h> int main() { short a = 10; int b = 100; long c=100; int short_length = size ...

  2. JAVA中自增自减运算符(i++与++i的区别)

    注意: 自增运算符和自减运算符只能用于变量,而不能用于常亮或表达式 运算符 运算 范例 结果 ++ 自增(前):先运算后取值 a=2;b=++a; a=3;b=3; ++ 自增(后):先取值后运算 a ...

  3. 简单配置nginx反向代理,实现跨域请求

    简单配置nginx去做反向代理,实现跨域请求 简单介绍nginx的nginx.conf最核心的配置,去做反向代理,实现跨域请求. 更多详细配置,参考nginx官方文档 先介绍几个nginx命令 打开n ...

  4. Javascript闭包解析----------------v客学院技术分享

    跟java,php等编程语言一样,javascript也采用词法作用域,简单的来说就是函数的执行依赖于变量的作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的.为了实现这种词法作用域,还必 ...

  5. 《鸟哥Linux私房菜》 全套视频和PDF资料—— 老段带你学鸟哥Linux视频课程

    <鸟哥的Linux私房菜-基础篇-服务器篇(第三版)>学习Linux极为经典的入门资料,但是还是很多同学难以坚持系统的看完整本书,最终以放弃而告终. 为了帮助大家更容易入门Linux,老段 ...

  6. CSS样式实现表头和列固定

    效果图:第一行和第一列固定       <!DOCTYPE html> <html lang="zh"> <head> <meta cha ...

  7. 小鹤双拼win10一键恢复布局

    起因 一直用的小鹤双拼布局,最近重装系统又要重新配置,麻烦 尝试 查找对应注册表设置,找到以下路径包含相应配置 HKEY_CURRENT_USER\Software\Microsoft\InputMe ...

  8. LeetCode通关:求次数有妙招,位运算三连

    分门别类刷算法,坚持,进步! 刷题路线参考: https://github.com/chefyuan/algorithm-base 大家好,我是刷题困难户老三,这一节我们来刷几道很有意思的求次数问题, ...

  9. 题解 P6688 可重集

    己所欲者,杀而夺之,亦同天赐 解题思路 一定不要用自动溢出的 Hash!!!!!!! 我真的是调吐了... 思路非常简单明了 : 需要我们创新一下 Hash. 首先我们的 Hash 要满足无序性.. ...

  10. C# 事件与继承

    在窗体编程过程中,常常会封装一个基类,包含未来业务中常用的属性.方法.委托.事件等,但是事件作为一个特殊的委托,只能在声明类中调用,派生类都不可以调用,所以在基类中必须实现一个虚函数,实现事件的调用, ...