一、场景

使用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. 【动画消消乐】HTML+CSS 自定义加载动画 061

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...

  2. C语言经典试题--指针

    分享一道C语言的经典的题目.题目要求如下: 利用字符指针实现字符串1"I Love China"与字符串2"So do I"的输出.然后利用字符指针将字符串2的 ...

  3. 泛型(8)-Java7的"菱形"语法与泛型构造器

    正如泛型方法允许在方法签名中声明泛型形参一样,Java也允许在构造器签名中声明泛型形参,这样就产生了所谓的泛型构造器. package com.j1803;class Foo{ public < ...

  4. Tomcat网站根目录设置

    直接将war放入到webapps目录下 修改server.xml文件,在Host节点下添加如下代码 <Context path="/" docBase="web&q ...

  5. js学习-apply,call,bind的实现

    目录 apply call bind demo apply 简单说:构建一个和调用aplly函数一样的字符串,用eval执行,完了之后删除掉,最后返回执行的结果. Function.prototype ...

  6. LeetCode 780. Reaching Points

    题目链接:https://leetcode.com/problems/reaching-points/ 题意:给定操作可以使点(x,y)变为点(x+y,y)或者点(x,x+y).现已知初始点(sx,s ...

  7. aptitude软件状态标志i、v、p

    输出的结果分三栏,分别为状态.包名和描述.而状态则由p.i.v等字母表示.查询后才知道这些标识的含义是这样的: i - 包已经成功安装,并且所有依赖都满足. c - 包已经被移除,但是配置文件被保留. ...

  8. 使用idea,GitHub时,push和clone出现的一些问题

    使用idea,GitHub时,push和clone出现的一些问题 报错:No anonymous write access 这个的原因是在idea记住的用户名和GitHub登录的不一样,导致报错.笔者 ...

  9. python虚拟环境之Pyenv

    一.windows下安装 1.使用命令安装 pip install pyenv-win --target %USERPROFILE%/.pyenv %USERPROFILE%/是具体的路径,例如 ## ...

  10. css--实现一个文字少时居中,文字换行时居左的样式

    前言 最近群里的小伙伴去面试,遇到这样一个问题,面试官问:"用 css 对一行文字进行布局,当文字不够换行的时候,这行文字要居中显示,当文字出现换行的时候,这行文字要靠左显示.", ...