当前位置: 首页 > 编程语言 > C#

Task(System.Threading.Task)和Thread的区别分享

时间:2023-04-10 22:49:07 C#

Task(System.Threading.Task)和Thread的区别根据我的理解,Task和Thread的区别是任务发生在线程池和线程是我需要自己管理的东西..(该任务可以取消并返回到他的任务结束的线程池)但是在一些博客中,我读到如果操作系统需要创建任务并创建线程=>,那么创建(和销毁)任务会更容易。有人可以解释为什么创建线程任务很容易吗?(也许我在这里遗漏了一些东西......)当你说Task是一个System.Threading.Task时,我认为这就是你在说什么。如果是这种情况,那么您可以这样想:为了解决这个问题,.NET框架允许您创建任务。任务是捆绑到对象中的工作片段,允许您做有趣的事情,例如捕获工作的输出和连接工作(先去商店,然后买杂志)。任务安排在线程池上。线程的确切数量取决于所使用的调度程序,但默认调度程序会尝试选择一些最适合您拥有的CPU内核数量以及任务实际使用CPU时间的线程。如果需要,您甚至可以编写自己的调度程序来执行特定的操作,例如确保该调度程序的所有任务始终在单个线程上运行。因此,将“任务”视为待办事项列表中的项目。你可能一次可以做5件事,但如果你的老板给你10,000件,它们就会堆积在你的收件箱中,直到你完成前5件。Tasks和ThreadPool之间的区别在于,Tasks(如前所述)让您可以更好地控制不同工作项之间的关系(想象一下将多个指令拼接在一起的todo),而ThreadPool只允许您排队一堆单独的单个项目(功能)。你听到了两种不同的宣教概念。第一个是工作的概念,第二个是工艺的概念。很久以前(用计算机术语来说),没有线程。程序的每个运行实例都称为进程,因为它只是一步一步地执行直到退出。这将流程的直观概念与工厂流水线的一系列步骤相匹配。操作系统管理进程抽象。然后,开发人员开始向工厂添加多条装配线。现在一个程序可以同时执行多个操作,库或(今天更常见的)操作系统将管理每个线程内步骤的调度。线程是一个轻量级的进程,但是一个线程属于一个进程,一个进程中的所有线程共享内存。另一方面,多个进程不能混淆彼此的内存。因此,Web服务器中的多个线程都可以访问有关连接的相同信息,但Word无法访问Excel的内存中数据结构,因为Word和Excel作为单独的进程运行。进程作为一系列步骤的想法与进程模型与线程并不匹配,因此有人将“以前称为进程的抽象”称为任务。这是您在博文中看到的第二个任务定义。请注意,许多人仍然使用“过程”一词来表示这一点。好吧,随着线程变得越来越普遍,开发人员在它们之上添加了更多抽象以使它们更易于使用。这导致了线程池的兴起,线程池是一个库管理的线程“池”。您将库传递给作业,库选择一个线程并在该线程上运行作业。.NET框架有一个线程池实现,当您第一次听到“任务”时,文档的真正意思是您传递给线程池的工作。所以从某种意义上说,文档和博客文章都是正确的。任务这个词的超载是令人遗憾的混乱的根源。线程已成为.Netv1.0的一部分,任务是在.Net4.0中发布的任务并行库TPL中引入的。您可以将Task视为Thread的更复杂版本。它们非常易于使用,并且与线程相比具有许多优点,如下所示:您可以为任务创建返回类型,就好像它们是函数一样。可以使用“ContinueWith”方法,它会等待上一个任务,然后开始执行。(抽象等待)根据我公司的指导原则,应避免使用摘要锁。您可以使用Task.WaitAll并传递一组任务,这样您就可以等到所有任务都完成。您可以将任务附加到父任务,这样您就可以决定父任务还是子任务先存在。您可以使用LINQ查询实现数据并行。您可以使用任务创建并行的for和foreach循环来轻松处理异常。*最重要的是,如果您在单核计算机上运行相同的代码,它将作为单个进程运行,没有任何线程开销。任务在线程上的缺点:需要.Net4.0学过操作系统的新手更能理解线程。框架的新手,所以在这里没有太大帮助。一些提示:-始终使用语义完美且标准的Task.Factory.StartNew方法。有关详细信息,请查看任务并行库http://msdn.microsoft.com/en-us/library/dd460717.aspx扩展EricLippert的评论:线程是一种允许应用程序并行执行多个操作的方法。例如,您的应用程序可能有一个线程处理来自用户的事件(例如按钮单击),而另一个线程执行长时间计算。这样,您就可以“同时”做两件事。如果不这样做,则在计算完成之前用户不会单击该按钮。所以线程可以执行你写的一些代码。另一方面,Task代表某种工作的抽象。作业可以有结果,您可以等到作业完成(通过调用Wait())或说您想在作业完成后做某事(通过调用ContinueWith())。您想要表示的最常见的工作类型是与当前代码并行执行一些计算。而Task为您提供了一种简单的方法。代码实际运行的方式和时间由TaskScheduler定义。默认使用ThreadPool:一组可以运行任何代码的线程。这样做是因为创建和切换线程效率低下。但Task不必直接与某些代码相关联。您可以使用TaskCompletionSource创建任务,然后随时设置其结果。例如,您可以创建一个任务并在用户单击按钮时将其标记为已完成。一些其他代码可以等待任务,并且在等待期间,没有代码执行任务。如果您想知道何时使用Task以及何时使用Thread:Task更易于使用,创建自己的Thread更高效。但有时,您需要比Task提供更多的控制。在这些情况下,直接使用Thread是有意义的。任务实际上只是用于手动旋转线程的样板代码的包装器。从根本上说,没有区别。任务只是让线程管理更容易,而且由于更少的样板噪音,它们通常更具表现力。以上就是C#学习教程的全部内容:Task(System.Threading.Task)和Thread的区别。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: