一、场景

使用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. Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

    爬取过程在这里: Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图 本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析. 依赖库: 豆瓣镜像比较快: ...

  2. 高性能内存图数据库RedisGraph(一)

    作为一种简单.通用的数据结构,图可以表示数据对象之间的复杂关系.生物信息学.计算机网络和社交媒体等领域中产生的大量数据,往往是相互连接.关系复杂且低结构化的,这类数据对传统数据库而言十分棘手,一个简单 ...

  3. lucene Hello World

    一个lucene创建索引和查找索引的样例: 创建索引: public class Indexer { private IndexWriter indexWriter; /** * 构造器实例化inde ...

  4. groff编写man页

    groff 是大多数 Unix 系统上所提供的流行的文本格式化工具 nroff/troff 的 GNU 版本.它一般用于编写手册页,即命令.编程接口等的在线文档.在本文中,我们将给你展示如何使用 gr ...

  5. java中的集合类学习(三)

    JAVA中有许多的集合,常用的有List,Set,Queue,Map. 1.其中List,Set,Queue都是Collection(集合),其每个元素都是单独的一个对象,如List<Strin ...

  6. python3中的缺省参数和global

    关于py中缺省参数: 在声明函数的时候对某些参数(一个或多个)进行赋值,在你调用的时候无需在实参列表中体现该参数,但是在执行的时候会默认加上这个已经在形参中定义好的参数. 但是,缺省参数必须放在最后, ...

  7. 冒泡排序(bubble_sort)——Python实现

      # 冒泡排序 # 作用:对给出的n个顺序不定的数进行排序 # 输入:任意数组A # 输出:按顺序排列的数组A   # 冒泡排序过程 # 第一趟:以第一个数为基准,从最后一位数开始,依次与它比较, ...

  8. 基于ifix组态软件研究控制按钮权限

    背景: 在前阵子做基于ifix生成电力监控平台时,遇到业主提出的一个需求.关于如何在控制弹窗中,点击相应的合分闸按钮时,优先弹出登录界面,当输入相应的有权限用户名和密码后,才能操作这一要求.后实现如下 ...

  9. Hadoop 3.1.1 - 概述 - 集群安装

    Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...

  10. Docker限制

    前言 Docker系列文章: 此篇是Docker系列的第十篇,大家一定要按照我做的Demo都手敲一遍,印象会更加深刻的,马上就开始Kubernetes,加油!一起前行! 为什么要学习Docker Do ...