C#基础--线程之Task

这篇具有很好参考价值的文章主要介绍了C#基础--线程之Task。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#基础–线程之Task

Task 是.NetFramework3.0出现的,Task里面的线程是来自于线程池

一、Task

1. 开启一个线程

Task 构造函数

传入一个无参数的 Action 委托作为参数

Task task = new Task(() =>
                     {
                         this.DoSomethingLong("btntask_Click1");
                     });
task.Start();

Run() 静态方法

//Run 为静态方法
Task.Run(() =>
         {
             this.DoSomethingLong("btntask_Click2");
         });

TaskFactory 工厂

TaskFactory taskFactory = new TaskFactory();
taskFactory.StartNew(() =>
                     {
                         this.DoSomethingLong("btntask_Click3");
                     });
TaskFactory taskFactory = Task.Factory;
taskFactory.StartNew(() =>
                     {
                         this.DoSomethingLong("btntask_Click3");
                     });

Task.Delay 延迟执行

Task.Delay 出现于4.5版本

Thread.Sleep() 是阻塞的,而 Delay 是非阻塞的;如果Sleep 和Delay 平级,则会因Sleep造成阻塞(卡界面)

ContinueWith 类似于回调

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

//任务在2000ms=2s 以后执行
Task task = Task.Delay(2000).ContinueWith(t =>  
                                          {
                                              Console.WriteLine($"之前花费时间:{stopwatch.ElapsedMilliseconds}");
                                              Console.WriteLine("回调已完成");
                                              Thread.Sleep(2000);
                                              Console.WriteLine($"之后花费时间:{stopwatch.ElapsedMilliseconds}");
                                              stopwatch.Stop();
                                          });

C#基础--线程之Task,C# .Net,c#,asp.net

2. 等待任务

2.1 WaitAny

阻塞式,当前线程会等待任意任务结束,然后才能执行后续语句

List<Task> tasksList = new List<Task>();

TaskFactory taskFactory = new TaskFactory();

tasksList.Add(taskFactory.StartNew(() => { this.Coding("杰克", "系统管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("流光易逝", "部门管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("偏执", "客户管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("清茶", "接口管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("秋陌", "写Api"); }));

//如果有一个同学完成了某一个模块,老师就需要准备环境!
//等待某一个线程执行完毕以后 继续往后执行
Task.WaitAny(tasksList.ToArray());
Console.WriteLine("Richard老师开始准备环境部署项目!");

C#基础--线程之Task,C# .Net,c#,asp.net

2.2 WaitAll

阻塞式,当前线程会等待所有任务结束,然后才能执行后续语句

List<Task> tasksList = new List<Task>();

TaskFactory taskFactory = new TaskFactory();

tasksList.Add(taskFactory.StartNew(() => { this.Coding("杰克", "系统管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("流光易逝", "部门管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("偏执", "客户管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("清茶", "接口管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("秋陌", "写Api"); }));

//Richard老师要等待大家都完成了以后,开始给点评!
Task.WaitAll(tasksList.ToArray()); //阻塞主线程
Console.WriteLine("5个模块均已完成,Richard老师点评!");

C#基础--线程之Task,C# .Net,c#,asp.net

2.3 WhenAny

非阻塞式,当前线程会返回一个新的任务,在该任务中等待任意任务结束,因此当前线程不会阻塞

static int TaskMethod(string name, int seconds)
{
    Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程: {2}",
    name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
    Thread.Sleep(TimeSpan.FromSeconds(seconds));
    return 42 * seconds;
}

var tasks = new List<Task<int>>();
for (int i = 1; i < 4; i++)
{
    int counter = i;
    var task = new Task<int>(() => TaskMethod(string.Format("Task {0}", counter), counter));
    tasks.Add(task);
    task.Start();
}
 
while (tasks.Count > 0)
{
    var completedTask = Task.WhenAny(tasks).Result;//这里的Result是指代Task<int>!
    tasks.Remove(completedTask);
    Console.WriteLine("A task has been completed with result {0}.", completedTask.Result);
}

C#基础--线程之Task,C# .Net,c#,asp.net

2.4 WhenAll

非阻塞式,当前线程会返回一个新的任务,在该任务中等待所有任务结束,因此当前线程不会阻塞

static int TaskMethod(string name, int seconds)
{
    Console.WriteLine("Task {0} 运行在线程 {1} 上。是否是线程池线程: {2}",
    name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
    Thread.Sleep(TimeSpan.FromSeconds(seconds));
    return 42 * seconds;
}

var firstTask = new Task<int>(() => TaskMethod("First Task", 3));
var secondTask = new Task<int>(() => TaskMethod("Second Task", 2));
var whenAllTask = Task.WhenAll(firstTask, secondTask);
whenAllTask.ContinueWith(t =>Console.WriteLine("The first answer is {0}, the second is {1}", t.Result[0], t.Result[1])
	, TaskContinuationOptions.OnlyOnRanToCompletion
);
 
firstTask.Start();
secondTask.Start();

C#基础--线程之Task,C# .Net,c#,asp.net文章来源地址https://www.toymoban.com/news/detail-589834.html

到了这里,关于C#基础--线程之Task的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用Asp.Net创建Web Service接口并调用

    目录 一.创建Asp.net web应用以及Web Service服务 (1).运行环境 (2)创建项目 二.创建控制台应用来调用上面创建的Web Service 开发工具: Visual Studio 2022 Current (免费社区版) 框架版本: .net framework4.7.2,更高的.net 5 、net6貌似没有默认提供带web service的asp.net 应用模板了。 确保VS的工作负荷有

    2024年01月18日
    浏览(35)
  • 【服务器】ASP.Net Core(C#)创建Web站点

    简单几步实现本地ASP.Net.Core web 站点结合cpolar内网穿透工具实现远程访问 1. 创建站点 *环境搭建,这边测试,使用.NET 6.0 SDK,可以点击跳转到官网下载,下载后安装即可. 安装完成后,进入到某个文件夹,打开powershell执行下面命令,创建新的 Web 应用,名称叫:aspnetcoreapp 2. 运行站点 信任开

    2024年02月11日
    浏览(39)
  • RDLC报表使用教程(VS2019+Asp.Net(C#)+iframework)

    VS2019 开发环境配置 在vs环境中,菜单扩展=管理扩展 联机中搜索 RDLC,出现MicroSoft RDLC Report Designer,如下 安装完毕后,点击右键项目(Asp.Net Web应用程序)=添加=新建项,会出现 报表、报表精灵(报表向导),如下:   新建报表后,就直接可以进行RDLC报表开发。 Web.Config里面配

    2024年02月01日
    浏览(70)
  • C#面:列举ASP.NET页面之间传递值的几种方式

    查询字符串(Query String): 可以通过在URL中添加参数来传递值。 例如:http://example.com/page.aspx?id=123 在接收页面中可以通过Request.QueryString[“id”]来获取传递的值。 会话状态(Session State): 可以使用Session对象在不同页面之间存储和检索值。 在发送页面中可以使用Session[“k

    2024年02月19日
    浏览(30)
  • ASP.NET Core 8 基础

    2023年11月将发布发布.NET 8,基于.NET 8 的 ASP.NET Core 8.0也会一并发布,这是继ASP.NET Core 6.0之后,又一个重要版本,因为引入了nativeAOT,在性能上有很大提升,所以系统地学习一下这项技术。 ASP.NET Core 的几个主要优势: 跨平台,支持 Windows, macOS, Linux,Docker,Azure和AWS等云服务自

    2024年02月11日
    浏览(35)
  • Asp.Net 使用Log4Net (基础版)

    创建ASP.NET Web Forms项目 在Visual Studio中创建一个新的ASP.NET Web Forms项目。命名为\\\"Log4NetDemo\\\"。 打开NuGet包管理器控制台,并运行以下命令来安装Log4Net: 在Web.config文件中添加Log4Net的配置。将以下内容粘贴到Web.config文件中。 在Global.asax文件中,我们需要初始化Log4Net。在 Applicatio

    2024年02月15日
    浏览(37)
  • C# ASP.NET Core Web API 身份授权(JWT)验证(一)

    1.开发环境 VS2022,安装时记得勾选ASP.NET有关的都选上,建议全选,省的麻烦。          2.创建初始工程 TestApi (你自己的工程名称)。    这就创建工程成功了,按 F5 则可以进行调试了。 而在项目中,我们不仅仅会用到基础的api功能,我们一般还会用到  身份授权(J

    2024年02月02日
    浏览(43)
  • 【ASP.NET Core 基础知识】--最佳实践和进阶主题--设计模式在ASP.NET Core中的应用

    一、设计模式概述 1.1 什么是设计模式 设计模式是在软件设计过程中反复出现的、经过验证的、可重用的解决问题的方法。它们是针对特定问题的通用解决方案,提供了一种在软件开发中可靠的指导和标准化方法。设计模式通常描述了一种在特定情景下的解决方案,包括了问

    2024年02月21日
    浏览(43)
  • 在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

    gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准,Google 内外的组织都在使用它来从微服务到计算的“最后一英里”(移动、网络和物联网)的强大用例。 gRPC是一个高性能的开源的通用RPC框架,由Google公司开发,支持常

    2024年04月23日
    浏览(25)
  • C# Asp.Net6 MVC,Log4net NLog 日志插件应用 及Windows、Liux环境下程序发布

    connected Services 服务依赖(第三方) Properties 文件下 launchSettings.json 项目启动配置文件 wwwroad 存放静态文件 依赖项 管理Nuget程序包 appsettings.json 配置文件 C 业务逻辑运算–调用其他的服务做业务逻辑 M 实体对象,保存数据,数据传输 V 视图,表现层 第一步:寻找log4net 程序包

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包