3 回答
TA贡献1776条经验 获得超12个赞
不能使用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
委托调用是绝对正常的(所有线程都由编译器完成)。
- 3 回答
- 0 关注
- 468 浏览
添加回答
举报