任务与线程差异

任务与线程差异

我对并行编程很陌生。在.NET中有两个类可用:TaskThread.

所以,我的问题是:

  • 这些类之间有什么区别?
  • 什么时候使用更好?

    Thread

    什么时候

    Task?


江户川乱折腾
浏览 469回答 3
3回答

叮当猫咪

通常你听到任务是一个比线程更高级的概念。..这就是这句话的意思:不能使用ABORT/ThreadAbortedException,您应该在定期测试“业务代码”中支持取消事件token.IsCancellationRequested标志(也避免长连接或无时间连接,例如到db,否则您将永远没有机会测试此标志)。出于类似的原因Thread.Sleep(delay)调用应替换为Task.Delay(delay, token)打电话。没有线Suspend和Resume方法具有任务的功能。不能重用任务实例也一样。但是你得到了两个新工具: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);因此,系统线程对任务是完全隐藏的,但在具体的系统线程中仍然执行任务的代码。系统线程是用于任务的资源。当然,在任务并行执行的遮罩下仍然存在线程池。线程如何执行新任务可能有不同的策略。另一个共享资源任务调度器关心它。一些问题任务调度器解决1)喜欢在同一个线程中执行任务及其计算,以最小化切换成本。内联执行2)更喜欢按已启动的顺序执行任务。公平3)根据“任务活动的先验知识”,在非活动线程之间更有效地分配任务。偷工..重要:一般来说,“异步”与“并行”不一样。使用TaskScheduler选项,您可以在一个线程中同步执行异步任务。为了表示并行代码执行,可以使用更高的抽象(比任务):Parallel.ForEach, PLINQ, Dataflow.任务与C#异步/等待特性集成承诺模型,例如那里requestButton.Clicked += async (o, e) => ProcessResponce(await client.RequestAsync(e.ResourceName));执行client.RequestAsync不会阻止UI线程。重要:引擎盖下Clicked委托调用是绝对正常的(所有线程都由编译器完成)。这就足以做出选择了。如果您需要支持调用倾向于挂起的遗留API的取消功能(例如,无时间连接),并且在本例中支持Thread.Abort(),或者如果您正在创建多线程背景计算,并且希望使用挂起/恢复优化线程之间的切换,这意味着手动管理并行执行-继续使用线程。否则就去执行任务,因为它们会让您轻松地操作它们中的组,将它们集成到语言中,并使开发人员更有效率-任务并行库(TPL) .
打开App,查看更多内容
随时随地看视频慕课网APP