C# 线程(四)——Task初始
//1、start——无返回值的方法,无参数(Action)、有一个参数Action<object?>
//1.1带参数的——public Task(Action<object?> action, object? state);
Action<Object?> action = objects =>
{
NoReturn(objects?.ToString());
};
var task1 = new Task(action, new Person());
task1.Start();
////1.2不带参数的——public Task(Action action);
Action action1 = NoParameterNoReturn;
var task2 = new Task(action1);
task2.Start();
2、Task.Run
相关重载
//public static Task Run(Action action, CancellationToken cancellationToken);
//public static Task<TResult> Run<TResult>(Func<TResult> function);
//Task<string>.Run(NoParameterReturn);
//public static Task<TResult> Run<TResult>(Func<TResult> function, CancellationToken cancellationToken);
//public static Task Run(Func<Task?> function);暂时没确定应用场景
public static class TaskRunSummary
{
public static async void RunTaskSummary()
{
//Task.Run() Action Lambda
Task t1 = Task.Run(() => { Debug.WriteLine("Task.Run() Action Lambda"); });
await t1; //Task.Run() Func<Task> Lambda Async
Task t2 = Task.Run(async () => { Debug.WriteLine("Task.Run() Func<Task> Lambda Async"); });
await t2; //Task.Run() Func<Task> Method Async
Task t3 = Task.Run(MethodAsync);
await t3; //Task.Run<TResult>() Func<TResult> Lambda
Task<string> t4 = Task.Run<string>(() => { Debug.WriteLine("Task.Run<TResult>() Func<TResult> Lambda"); return "Task.Run<TResult>() Func<TResult> Lambda Return Value"; });
Console.WriteLine(await t4); //Task.Run<TResult>() Func<Task<TResult>> Lambda Async
Task<string> t5 = Task.Run<string>(async () => { Debug.WriteLine("Task.Run<TResult>() Func<Task<TResult>> Lambda Async"); return "Task.Run<TResult>() Func<Task<TResult>> Lambda Async Return Value"; });
Console.WriteLine(await t5); //Task.Run<TResult>() Func<Task<TResult>> Method Async
Task<string> t6 = Task.Run<string>(new Func<Task<string>>(ParameteredMethodAsync));
Console.WriteLine(await t6);
} public static async Task MethodAsync()
{
Debug.WriteLine("Task.Run() Func<Task> Method Async");
} public static async Task<string> ParameteredMethodAsync()
{
Debug.WriteLine("Task.Run<TResult>() Func<Task<TResult>> Method Async");
return "Task.Run<TResult>() Func<Task<TResult>> Method Async Return Value";
}
}
3、Task.Factory.StartNew——支持Action、Action<T>、Func<T>等参数
Task.Factory.StartNew(NoParameterNoReturn);
//3.1TaskFactory执行,和3差不多3是创建一个匿名TaskFactory去执行
TaskFactory taskFactory1 = new TaskFactory();
taskFactory1.StartNew(NoParameterNoReturn);
public static void NoParameterNoReturn()
{ Debug.WriteLine("无参数无返回值方法");
}
三、Task的相关属性及方法
Task.Delay
1.Task.Delay实质是创建一个任务,再任务中开启一个定时间,然后延时指定的时间
2.Task.Delay不和await一起使用情况,当代码遇到Task.Delay一句时,创建了了一个新的任务去执行延时去了,当前代码继续往下执行
3.Task.Delay和await一起使用,当代码遇到await Task.Delay时候,当前线程要等该行代码执行完成后,再继续执行后面的代码
Delay与Thread.sleep的区别
Thread.Sleep——这是暂停执行的经典方式。此方法将暂停当前线程,直到经过给定的时间,在此期间当前线程无响应
Task.Delay——任务延迟的作用方式与线程截然不同。延迟将创建一个任务,该任务将在延迟一段时间后完成。任务延迟不会阻塞调用线程,因此调用线程将保持响应。
ContinueWith——
ContinueWith(Action<Task>)创建一个在目标 Task 完成时异步执行的延续任务。常和Task.Delay一起使用用来做延迟动作
public static async Task UseDelayWithAwait()
{
Debug.WriteLine($"使用Await的线程id:{Thread.CurrentThread.ManagedThreadId}执行开始》》");
Stopwatch sw = Stopwatch.StartNew();
await Task.Delay(1000);
sw.Stop();
Debug.WriteLine($"使用Await的线程id:{Thread.CurrentThread.ManagedThreadId}执行完毕,耗时{sw.ElapsedMilliseconds}毫秒");
}
public static void UseDelayWithNoAwait()
{
Debug.WriteLine($"不使用Await的线程id:{Thread.CurrentThread.ManagedThreadId}执行开始》》");
Stopwatch sw = Stopwatch.StartNew();
Task.Delay(1000);
sw.Stop();
Debug.WriteLine($"不使用Await的线程id:{Thread.CurrentThread.ManagedThreadId}执行完毕,耗时{sw.ElapsedMilliseconds}毫秒");
}
public static async Task ContinueWithMethod()
{
Stopwatch sw = Stopwatch.StartNew();
Debug.WriteLine($"当前线程id:{Thread.CurrentThread.ManagedThreadId}");
await Task.Delay(3000).ContinueWith(t =>
{
Debug.WriteLine($"ContinueWith创建的Task线程id:{Thread.CurrentThread.ManagedThreadId}");
});
sw.Stop();
Debug.WriteLine($"延迟三秒后的Task执行完毕,耗时{sw.ElapsedMilliseconds}毫秒");
}
//执行结果
//Task.Delay总结
{
//1、当前cpu执行线程遇到await Task.Delay时,会等待但他等待时会执行其他任务(不阻塞),在等待完成时由本执行cpu或其他执行cpu继续执行,所以await delay前后的代码可能不是一个cpu执行线程在执行,所以会出现下面的结果
Task.Run(() => TaskDelaySummary.UseDelayWithAwait());
//结果打印1:
//使用Await的线程id:4执行开始》》
//使用Await的线程id:5执行完毕,耗时1011毫秒
//结果打印2:
//使用Await的线程id:7执行开始》》
//使用Await的线程id:7执行完毕,耗时1007毫秒 //2、在不和await调用时,当执行cpu遇到Task.Delay时,不会等待,直接继续执行,所以前后的执行线程id是一致的
Task.Run(() => TaskDelaySummary.UseDelayWithNoAwait());
//结果打印:
//不使用Await的线程id:4执行开始》》
//不使用Await的线程id:4执行完毕,耗时0毫秒
Task.Run(async () =>
{
await TaskContinueWithSummary.ContinueWithMethod();
});
//结果打印:
//当前线程id:4
//ContinueWith创建的Task线程id:5
//延迟三秒后的Task执行完毕,耗时3015毫秒 }
C# 线程(四)——Task初始的更多相关文章
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
- C#中的线程四(System.Threading.Thread)
C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...
- 第四章初始CSS3预习笔记
第四章 初始CSS3预习笔记 一: 1: 什么是CSS? 全称是层叠样式表;/通常又称为风格样式表,.他是用来进行网页风格设计的; 2:CSS的优势: 1>内容以表现分离,即使用u前面学习的HT ...
- 菜鸟之旅——学习线程(Task)
前面两篇回顾线程和线程池的使用方法,微软在.NET4.5推出了新的线程模型-Task.本篇将简单的介绍Task的使用方法. Task与线程 Task与线程或者说线程池关系紧密,可以说是基于线程池实现的 ...
- C#线程篇---Task(任务)和线程池不得不说的秘密(5)
在上篇最后一个例子之后,我们发现了怎么去使用线程池,调用ThreadPool的QueueUserWorkItem方法来发起一次异步的.计算限制的操作,例子很简单,不是吗? 然而,在今天这篇博客中,我们 ...
- C#线程篇---Task(任务)和线程池不得不说的秘密
我们要知道的是,QueueUserWorkItem这个技术存在许多限制.其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启 ...
- java线程四种状态
一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...
- 线程 线程池 Task
首先声明 这是读了 愉悦的绅士 文章 <菜鸟之旅——学习线程(线程和线程池)> <Task与线程> 的一些个人总结,还是那句话,如有不对,欢迎指正 文章以代码加注释的方法展示. ...
- spring boot tomcat 线程数 修改初始线程数 统计性能 每百次请求耗时
[root@f java]# tail -30 nohup.outsearchES-TimeMillisSpent:448P->1602@fT->http-nio-8080-exec-3t ...
- Linux 进程与线程四(加锁--解锁)
线程共享进程的内存空间,打开的文件描述符,全局变量. 当有多个线程同事访问一块内存空间或者一个变量.一个文件描述符,如果不加控制,那么可能会出现意想不到的结果. 原子操作 对于我们的高级语言(C语言, ...
随机推荐
- CDN与云计算技术的结合:专业视角下的深度融合
本文分享自天翼云开发者社区<CDN与云计算技术的结合:专业视角下的深度融合>,作者:大利 随着信息技术的不断发展,内容分发网络(CDN)与云计算技术作为两种重要的互联网基础设施,其结合已成 ...
- Luogu P11036 GCD 与 LCM 问题 [ 绿 ] [ 构造 ] [ 数论 ] [ adhoc ]
Luogu P11036 GCD 与 LCM 问题:梦熊的题真是又神又逆天. 思路 观察到有个奇数的特殊性质,我们尝试从奇数构造入手. 先来尝试带入极端数据,对于 \(\gcd\),我们可以把 \(b ...
- 你的边比较松弛:最短路的 Bellman-Ford 和 SPFA 方法
Dijkstra 的局限性 在带权图的最短路径问题中,我们的目标是从一个起点出发,找到到达其他所有节点的最短路径.无论是交通导航中的最短耗时路线,还是金融网络中的最小成本路径,这一问题的核心始终是如何 ...
- Python - “人生苦短,我用Python”
Python中的值(数据)类型 类型 描述 说明 数字(Number) 支持 整数(int) 浮点数(float) 复数(complex) 布尔(bool) 整数(int),如:10.-10 浮点数( ...
- CentOS7搭建CDH5.15.0集群
CentOS7搭建CDH5.15.0集群 一.节点说明 节点 Server/Agent Memory master Server & agent 4G node1 agent 2G node2 ...
- 【忍者算法】从快慢指针到倒数查找:优雅解决链表倒数问题|LeetCode第19题"删除链表的倒数第N个结点"
从快慢指针到倒数查找:优雅解决链表倒数问题 从生活场景说起 想象你在一个漫长的队伍中,想知道自己距离队尾还有多少人.一个巧妙的方法是:让你的朋友从你所在位置往后数N步,然后你和朋友一起向后走.当朋友走 ...
- DeepSeek满血版测试
技术背景 很多厂商以次充好,用蒸馏版DeepSeek冒充满血版.本文提供一些收集的问题集,可以用于测试是否满血DeepSeek.经过实际测试,国内厂商中只有满血版DeepSeek可以全对.但是各厂商后 ...
- 2个月搞定计算机二级C语言——真题(11)解析
1. 前言 今天双 11,正好轮到讲第 11 篇,直接来个三 11. 那么本篇我们讲解2个月搞定计算机二级C语言--真题11 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include ...
- Python实现PDF转换文件格式
最近工作中经常遇到收到其他人提供的pdf文档,想要编辑修改下或者复制部分内容比较困难,想通过现有的pdf工具软件转换文档格式,基本都要充钱,为了免费实现pdf转换工具,网上查了下相关技术方案,整理了下 ...
- oracle中查看锁表,ORACLE中查看当前系统中锁表情况
1.ORACLE中查看当前系统中锁表情况 select * from v$locked_object 2.可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$se ...