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语言, ...
随机推荐
- FLink17--聚合函数-AggWindowApp
一.依赖 二.代码 package net.xdclass.class11; import org.apache.flink.api.common.RuntimeExecutionMode; impo ...
- DeepSeek-V3 解读:优化效率与规模
DeepSeek-V3 是大语言模型(LLM)领域的一项变革性进展,为开源人工智能设定了新的标杆.作为一个拥有 6710 亿参数的专家混合(Mixture-of-Experts,MoE)模型,其中每个 ...
- [SDOI2008] Sandy的卡片 题解
讲一种自认为最暴力的方法. 首先肯定还是用差分的思想,对于每一张卡片进行重新标号,在卡片串与卡片串中插入特殊字符,然后找重复了 \(n\) 次的子串. 这里我们对于每一个子串开一个大小为 \(n\) ...
- IIS反向代理和URL重写——实现https重定向,文件类型隐藏访问重写,nodejs等服务重写等等
一.Why? 1.先来讲一讲为什么我们要使用url重写这个东西 2.因为我学习的后端是nodejs,然后我发现nodejs一个非常让人难受的事,就是它监听端口不是80和443时,你访问网页需要输入端口 ...
- 2024.11.21随笔&联考总结(补)
前言 都过了几天了,但是还是大概写一下吧,希望不要耽误太多时间. 考试 第一题签到题直接做. 第二题一眼是矩阵乘法优化 dp,然后大概看了几眼先不管去看第三题.然后第三题是数学题,感觉很可做.然后看到 ...
- 面试题58 - I. 翻转单词顺序
地址:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/ <?php/**输入一个英文句子,翻转句子中单词的顺序,但单 ...
- bp安装+匹配规则(防止抓火狐的多余包)
bp安装使用 BurpLoaderKeygen.jar: 2c8c7b95640f31985f83580402f26a06b78c55877fa33ef1f9d14d2ebb2d8ecd burpsu ...
- Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...
- Linux 安装配置Anaconda
下载地址 https://www.anaconda.com/download/success 选择系统版本,复制链接 wget https://repo.anaconda.com/archive/An ...
- Golang 入门 : 浮点数
浮点数介绍 Go语言提供了两种精度的浮点数:float32 和 float64.它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持. 这些浮点数类型的范围可以从很微小 ...