叮当猫咪
通常你听到任务是一个比线程更高级的概念。..这就是这句话的意思:不能使用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) .