首页 > 编程语言 >C#中Thread和Task的区别

C#中Thread和Task的区别

时间:2024-02-05 18:12:02浏览次数:26  
标签:MessageBox Task Thread Show C# bbbb 线程

https://blog.csdn.net/happyjava2/article/details/131411791

Thread 和 Task 是 .NET 框架中用于实现多线程编程的两个重要概念。它们的主要区别如下:

1、基于不同的 .NET 框架:Thread 是基于 Windows 操作系统提供的 API 实现,而 Task 则是基于 .NET框架提供的 TPL(Task Parallel Library)实现。
2、默认执行线程池:Thread 默认使用前台线程,而 Task 默认使用后台线程。这意味着,Thread 会阻塞主线程,而 Task不会。
3、异步执行:Task 支持异步执行,而 Thread 不支持。这意味着,在使用 Task 时,可以通过 await 和 async关键字轻松实现异步编程,而 Thread 则需要手动管理线程的启动和等待。
4、异常处理:Task 提供了更好的异常处理机制,可以将异常传递给调用方,而 Thread 则需要在每个线程中处理异常。
5、任务调度器:Task 提供了任务调度器(TaskScheduler),可以控制任务的并发性和调度方式,而 Thread 则没有这个功能。
6、返回值:Task 可以有返回值,而 Thread 没有。这是因为 Task 是基于 TPL 实现的,可以利用 .NET框架提供的并发编程模型来实现任务之间的依赖和调度。
总之,Thread 和 Task 都是实现多线程编程的工具,但它们基于不同的框架和 API,有各自的优缺点。在使用时,需要根据具体的需求和场景来选择合适的工具。

例1:Thread实现

Thread t = new Thread(() =>
{
	Thread.Sleep(3000);
	MessageBox.Show("aaaa");
});
t.Start();

例2:Task,先弹出bbbb,再弹出aaaa

private void TaskFun()
{
	Task.Run(() =>
	{
		Thread.Sleep(3000);
		MessageBox.Show("aaaa");
	});
	MessageBox.Show("bbbb");
}

例3:Task前增加await,方法增加async,实现异步,先弹出aaa再弹出bbbb

private async void TaskFun()
{
	await Task.Run(() =>
	{
		Thread.Sleep(3000);
		MessageBox.Show("aaaa");
	});
	MessageBox.Show("bbbb");
}

例4:Task实现同时执行多个Task

private void TaskFun()
{
	List<Task> ts = new List<Task>();
	ts.Add(Task.Run(() =>
	{
		Thread.Sleep(3000);
		MessageBox.Show("aaaa");
	}));
	ts.Add(Task.Run(() =>
	{
		Thread.Sleep(4000);
		MessageBox.Show("bbbb");
	}));
	Task.WhenAll(ts).ContinueWith(t =>
	{
		MessageBox.Show("cccc");
	});
}

  

标签:MessageBox,Task,Thread,Show,C#,bbbb,线程
From: https://www.cnblogs.com/Dongmy/p/18008594

相关文章

  • [BJDCTF2020]ZJCTF,不过如此
    [BJDCTF2020]ZJCTF,不过如此代码审计,在符合if的条件后,我们可以通过include函数包含想要查看的文件因此,首先需要传入两个参数text和file:text参数必须不为空,内容需要为Ihaveadream,file参数的内容则在后面的注释里提示我们为next.php,并且file参数里面不能包含/flag/,否则程序会......
  • 稳定编号系统 - 我的世界OCO指令系列
    最近在搞一些我的世界指令。其中有这么一个指令,需要编号系统,也就是uid。本指令需要引用的模块:玩家进入退出检测意义通常的编号系统中,当玩家进入或退出时,编号会从头重新分配。然而这样会导致编号不是很稳定。比如编号的一个用途是用来传送特定玩家。按照通常的编号分配......
  • C#多线程编程的Task(任务全面解析)
    原文链接:https://www.cnblogs.com/xietianjiao/p/7429742.htmlTask是.NET4.0加入的,跟线程池ThreadPool的功能类似,用Task开启新任务时,会从线程池中调用线程,而Thread每次实例化都会创建一个新的线程。 我们可以说Task是一种基于任务的编程模型。它与thread的主要区别是,它更加方便......
  • docker 启动jar包
    1、编写Dockerfile文件FROMopenjdk:8ENVTZ="Asia/Shanghai"ADDcim-gisportal.jarcim-gisportal.jarADDnohup.outnohup.outENTRYPOINT["nohup","java","-jar","/cim-gisportal.jar",">nohup.out&&quo......
  • Cucumber步骤中传Data Table作为参数
    引用链接:http://cukes.info/step-definitions.htmlDataTablesDataTablesarehandyforspecifyingalargerpieceofdata:Giventhefollowingusersexist:|name|email|phone||Aslak|[email protected]|123||Matt|[email protected]|2......
  • Cesium常用知识点
    构建四元数//地理位置坐标(三维)constposition=Cesium.Cartesian3.fromDegrees(-123.0744619,44.0503706,height);constheading=Cesium.Math.toRadians(135);//航向constpitch=0;//俯仰constroll=0;//横滚角consthpr=newCesium.Headi......
  • 【板子】网络流(Dinic)
    #include<bits/stdc++.h>usingnamespacestd;constintN=205;constintM=205;constintINF=0x3f3f3f3f;intedgeid=2;inthead[N];structedge{intv,w,nxt;}e[M*2];inlinevoidaddedge(intu,intv,intw){e[edgeid].v=v;e[ed......
  • C#之lock
    原文链接:https://blog.csdn.net/u012563853/article/details/124767902lock语法是:privateobjecto=newobject();//创建一个对象publicvoidWork(){lock(o)//锁住这个对象{//做一些必须按照顺序做的事情}}目的是,在多线程中,使用lock后,能......
  • c++的类开发第一篇
    class_1什么是接口?类就是一种公共接口,公众(public)是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。例如,要计算string对象中包含多少个字符,您无需打开对象,而只需使用string类提供的s......
  • Proxmox 7.4 使用vgpu_unlock,为GTX1060开启vGPU支持
    本文在2021年发布的博客《Proxmox5.4使用vgpu_unlock,为GTX1060开启vGPU支持》,介绍了ProxmoxVE5.4上部署vGPUunlock的操作步骤。 后续有发布了在 ProxmoxVE7.x上支持vGPU的博客《Proxmox7.2部署DoraCloud桌面云,支持vGPU》,实现了通过3个脚本完成vGPU的配置。 ......