当前位置: 首页 > 知识库问答 >
问题:

任务与线程差异[重复]

公冶子琪
2023-03-14

我是并行编程的新手。.NET 中有两个类可用:任务类和线程类

所以,我的问题是:

  • 这些课程之间有什么区别
  • 什么时候使用<code>线程<code>优于<code>任务<code>更好(反之亦然)

共有3个答案

宦博超
2023-03-14
匿名用户

< code>Thread类用于在Windows中创建和操作线程。

任务表示一些异步操作,是任务并行库的一部分,任务并行库是一组用于异步和并行运行任务的 API。

在过去的日子里(即在TPL之前),使用<code>线程

如今,使用任务和TPL在90%的情况下是一个更好的解决方案,因为它提供了允许更有效地使用系统资源的抽象。我想在一些场景中,您希望对运行代码的线程进行显式控制,但是一般来说,如果您希望异步运行某些东西,您的第一个调用端口应该是TPL。

翁和正
2023-03-14
匿名用户

通常你会听到任务是一个比线程更高级别的概念…这就是这个短语的意思:

>

  • 您不能使用Abort/ThreadAbortedException,您应该在“业务代码”中支持取消事件,定期测试<code>令牌。IsCancellationRequested标志(还应避免长时间或无超时连接,例如连接到db,否则您将永远没有机会测试此标志)。由于类似的原因<code>线程。睡眠(延迟)调用应替换为任务。延迟(延迟,令牌)call(在内部传递令牌以有可能中断延迟)。

    没有线程的“挂起”“恢复”方法功能。任务实例也不能重用。

    但你有两个新工具:

    a) 延续

    // continuation with ContinueWhenAll - execute the delegate, when ALL
    // tasks[] had been finished; other option is ContinueWhenAny
    
    Task.Factory.ContinueWhenAll( 
       tasks,
       () => {
           int answer = tasks[0].Result + tasks[1].Result;
           Console.WriteLine("The answer is {0}", answer);
       }
    );
    

    b) 嵌套/子任务

    //StartNew - starts task immediately, parent ends whith child
    var parent = Task.Factory.StartNew
    (() => {
              var child = Task.Factory.StartNew(() =>
             {
             //...
             });
          },  
          TaskCreationOptions.AttachedToParent
    );
    

    所以系统线程对任务完全隐藏,但任务的代码仍然在具体的系统线程中执行。系统线程是任务的资源,当然,在任务的并行执行之下仍然存在线程池。线程如何执行新任务可以有不同的策略。另一个共享资源TaskScheduler关心它。TaskScheduler解决的一些问题1)更喜欢在同一线程中执行任务及其关联,以最小化切换成本(也称为内联执行)2)更喜欢按启动顺序执行任务-也称为优先公平性3)根据“任务活动的先验知识”-也称为工作窃取,在非活动线程之间更有效地分配任务。重要提示:“异步”通常与“并行”不同。使用TaskScheduler选项,可以设置异步任务在一个线程中同步执行。为了表示并行代码执行,可以使用比任务更高的抽象:<code>parallel。ForEach,PLINQ数据

    任务与 C# 异步/等待功能(也称为promise模型)集成,例如,存在请求按钮。

    这足以做出选择。如果您需要支持调用倾向于挂起的旧版 API 的取消功能(例如,无超时连接),并且对于这种情况支持 Thread.Abort(),或者如果您正在创建多线程后台计算并希望使用挂起/恢复来优化线程之间的切换,这意味着手动管理并行执行 - 请继续使用 Thread。否则,请转到任务,因为它们将为您提供轻松操作的组,集成到语言中并使开发人员更有效率 - 任务并行库(TPL)。

  • 谢海阳
    2023-03-14

    线程是一个较低级别的概念:如果你直接启动一个线程,你知道它将是一个单独的线程,而不是在线程池等上执行

    任务不仅仅是“在哪里运行一些代码”的抽象 - 它实际上只是“未来结果的promise”。例如一些不同的例子:

    • Task.Delay不需要任何实际的CPU时间;这就像设置一个计时器在未来关闭一样
    • WebClient.DownloadStringTaskAsync返回的任务不会在本地占用太多CPU时间;它代表的结果可能大部分时间都花在网络延迟或远程工作上(在Web服务器上)
    • Task.Run()返回的任务实际上是在说"我希望你单独执行这段代码";执行这段代码的确切线程取决于许多因素。

    请注意,任务

    一般来说,我建议您尽可能使用更高级别的抽象:在现代C#代码中,您应该很少需要显式启动自己的线程。

     类似资料:
    • 我在StackOverflow的职业生涯中有一个第一个问题。我希望是你帮我。 发生了什么:

    • 我正在探索使用Spring Boot的异步servlet。据我所知,异步servlet用于在一个线程中执行长时间运行的任务,而不是容器为处理请求而启动的线程,这样容器就可以使用自己的线程来处理其他连接。基于这样的理解,我尝试了以下代码: 但问题是,运行的同一线程正在调用方法。不是应该不一样吗?

    • 我正试图在过期日期前三天,但我不知道如何发送? 思维方式 检索剩余三天到期的所有订阅者 发送电子邮件给他们的用户 代码 表我需要检查名为 这个表有一个名为的列,我需要检查它以找到

    • 使用Java的工作代码: C++代码用dictionary[“Apple”,“Pen”]返回“ApplePenApple”的false,我不知道为什么java返回true是正确的。这两种解决方案之间唯一的主要区别(我认为)是我的C++在java代码中使用向量而不是原生数组。最初,我认为这可能与C++使用自动存储(堆栈)而不是自由存储(堆)有关,这就是为什么我使用向量而不是C样式的数组来避免内存管理

    • 本文向大家介绍Django异步任务线程池实现原理,包括了Django异步任务线程池实现原理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中

    • 我有一个应用程序,它使用JSON定期(固定时间间隔,20秒)从服务器请求数据。 我目前的实现包括在一个异步任务中有一个循环,有一个20秒的“睡眠”条件。然而,这似乎不是一个好的实现。我的问题是有没有更好的实施方案。还有,有没有一种好的方法可以从主线程中强制停止异步任务。? 另一种选择是更改代码,让客户机发送一个请求,让服务器让服务器循环返回答案。哪一种更好的实施方式提前感谢:)