2、Task 使用 ContinueWith 而不要使用 Wait
1、线程自旋:在阻塞线程的时候为了等待解锁(访问临界资源)(Sleep)。
2、上下文切换:将处理器当前线程的状态保存到操作系统内部的线程对象中,然后再挑出一个就绪的线程,把上下文信息传递给处理器,然后执行这个线程。
要尽量避免上述两种情况。
using System.Threading.Tasks; namespace ShouldCode
{
public sealed class ShouldContinueNotWait
{
public Task ShouldContinue()
{
var task = Task.Run(() =>
{
System.Console.WriteLine("任务1完成!");
});
//尽量使用 ContinueWith 处理后续任务
task.ContinueWith(t => System.Console.WriteLine("任务1后续任务1完成!"))
.ContinueWith(t => System.Console.WriteLine("任务1后续任务1的后续任务完成!"));
//耗时短的后续任务应该使用同一个线程避免可能发生的上下文切换
task.ContinueWith(t => System.Console.WriteLine("任务1后续任务2完成!"), TaskContinuationOptions.ExecuteSynchronously);
return task;
} public Task NotWait()
{
var task = Task.Run(() =>
{
System.Console.WriteLine("任务1完成!");
});
task.Wait();
System.Console.WriteLine("任务1后续任务完成!");
return task;
} public async Task ShouldAwait()
{
var task = Task.Run(() =>
{
System.Console.WriteLine("任务1完成!");
});
await task;
//此语法糖基于 continuewith 实现,和 ShouldContinue 相同
System.Console.WriteLine("任务1后续任务完成!");
} public async Task NotWaitAsync()
{
var task = Task.Run(() =>
{
System.Console.WriteLine("任务1完成!");
});
//异步方法中不要同步等待
//task.Wait();尽量不要使用。
task.Wait();
await Task.Run(() =>
{
System.Console.WriteLine("任务2完成!");
});
}
}
}
2、Task 使用 ContinueWith 而不要使用 Wait的更多相关文章
- 第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions
一. 整体说明 揭秘: 该章节的性质和上一个章节类似,也是一个扩展的章节,主要来研究Task类下的实例方法ContinueWith中的参数TaskContinuationOptions. 通过F12查 ...
- C# Task ContinueWith的实现
看了上一篇C# Task 是什么?返回值如何实现? Wait如何实现 我们提到FinishContinuations方法中会调用TaskContinuation实例,那么我们的ContinueWith ...
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
- 任务(task)
任务概述 线程(Thread)是创建并发的底层工具,因此有一定的局限性(不易得到返回值(必须通过创建共享域):异常的捕获和处理也麻烦:同时线程执行完毕后无法再次开启该线程),这些局限性会降低性能同时影 ...
- C# 异步编程Task整理(一)
一.简介 .Net Framework 4.0新增了一个System.Threading.Tasks命名空间,它包含的类提供了任务的相关操作.使用任务不仅可以获得一个抽象层,还能对底层线程进行很多统一 ...
- C# 使用Task执行异步操作
为什么要使用 Task Task 和 Thread 区别 Task 介绍 Task 简单实现 Task 执行状态 为什么要使用 Task 线程是创建并发的底层工具,因此具有一定的局限性. 没有简单的方 ...
- 【C#】线程之Task
Task开启线程 有两种启动方式: 1.构造创建线程,然后启动 var taskForAction = new Task(() => { //do something }); taskForAc ...
- Task.Run Vs Task.Factory.StartNew
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- Task.Run Vs Task.Factory.StartNew z
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
随机推荐
- E20181120-hm
checkerboard n. 西洋跳棋盘; checker n. 方格图案;
- SCUTOJ - 362 - CC的族谱 - 树上倍增
https://scut.online/p/362 和LCA差不多,注意开大点不怕浪费. #include<bits/stdc++.h> using namespace std; type ...
- 如何设置Xcode模拟器地图的当前位置
使用模拟器上的地图的话,需要设置当前位置,开启定位后,才能定位准确. 一.选中模拟器:Debug - Location - Custom Location 弹出的纬经度坐标.纬经度.纬经度坐标,默认显 ...
- C#:索引
1. 什么是索引 索引是一组get和set访问器,类似于属性的访问器. 2. 索引和属性 和属性一样,索引不用分配内存来存储 索引和属性都主要被用来访问其他数据成员,这些成员和它们关联,它们为这些成员 ...
- web前端篇:JavaScript基础篇(易懂小白上手快)-2
目录 一.内容回顾: ECMAScript基础语法 1.基本数据类型和引用数据类型 2.条件判断和循环 3.赋值运算符,逻辑运算符 4.字符串的常用方法 5.数组的常用方法 6.对象 7.函数 8.日 ...
- 黑马Lambda表达式学习 Stream流 函数式接口 Lambda表达式 方法引用
- Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games
链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...
- HDU6440(费马小定理)
其实我读题都懵逼--他给出一个素数p,让你设计一种加和乘的运算使得\[(m+n)^p = m^p+n^p\] 答案是设计成%p意义下的加法和乘法,这样:\[(m+n)^p\ \%\ p = m+n\] ...
- 洛谷 P2376 [USACO09OCT]津贴Allowance
https://www.luogu.org/problemnew/show/P2376 看了题解做的,根本不会贪心.. #include<cstdio> #include<algor ...
- Sawgger框架
简介详情:https://blog.csdn.net/sanyaoxu_2/article/details/80555328