为了账号安全,请及时绑定邮箱和手机立即绑定

请问任务与线程差异

请问任务与线程差异

C#
尚方宝剑之说 2019-08-02 12:02:42
任务与线程差异我对并行编程很陌生。在.NET中有两个类可用:Task和Thread.所以,我的问题是:这些类之间有什么区别?什么时候使用更好?Thread什么时候Task?
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

通常你听到任务是一个比线程更高级的概念。..这就是这句话的意思:

  1. 不能使用ABORT/ThreadAbortedException,您应该在定期测试“业务代码”中支持取消事件token.IsCancellationRequested标志(也避免长连接或无时间连接,例如到db,否则您将永远没有机会测试此标志)。出于类似的原因Thread.Sleep(delay)调用应替换为Task.Delay(delay, token)打电话。

  2. 没有线SuspendResume方法具有任务的功能。不能重用任务实例也一样。

  3. 但是你得到了两个新工具:

    a)延续

    // continuation with ContinueWhenAll - execute the delegate, when ALL// tasks[] had been finished; other option is ContinueWhenAnyTask.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 childvar parent = Task.Factory.StartNew(() => {
              var child = Task.Factory.StartNew(() =>
             {
             //...
             });
          },  
          TaskCreationOptions.AttachedToParent);
  4. 因此,系统线程对任务是完全隐藏的,但在具体的系统线程中仍然执行任务的代码。系统线程是用于任务的资源。当然,在任务并行执行的遮罩下仍然存在线程池。线程如何执行新任务可能有不同的策略。另一个共享资源任务调度器关心它。一些问题任务调度器解决1)喜欢在同一个线程中执行任务及其计算,以最小化切换成本。内联执行2)更喜欢按已启动的顺序执行任务。公平3)根据“任务活动的先验知识”,在非活动线程之间更有效地分配任务。偷工..重要:一般来说,“异步”与“并行”不一样。使用TaskScheduler选项,您可以在一个线程中同步执行异步任务。为了表示并行代码执行,可以使用更高的抽象(比任务):Parallel.ForEachPLINQDataflow.

  5. 任务与C#异步/等待特性集成承诺模型,例如那里requestButton.Clicked += async (o, e) => ProcessResponce(await client.RequestAsync(e.ResourceName));执行client.RequestAsync不会阻止UI线程。重要:引擎盖下Clicked委托调用是绝对正常的(所有线程都由编译器完成)。

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



查看完整回答
反对 回复 2019-08-03
  • 3 回答
  • 0 关注
  • 216 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信