【发布时间】:2018-09-29 23:17:03
【问题描述】:
假设我有一个生成int 的Task,以及一个接受int 的回调:
Task<int> task = ...;
Action<int> f = ...;
现在我想设置它,以便一旦任务完成并返回其整数结果,将使用该整数调用 callfack f - 无需主线程等待任务完成:
-
据我了解,典型的解决方案是
Task.ContinueWith方法:task.ContinueWith(t => f(t.Result)); -
但是,也可以为该任务获取
TaskAwaiter,并使用其类似事件的界面:TaskAwaiter<int> awaiter = task.GetAwaiter(); awaiter.OnCompleted(() => f(awaiter.GetResult()));
现在,我意识到TaskAwaiter 不适合在应用程序代码中普遍使用,而主要存在于await 关键字内部使用。
但是为了加深对TPL的理解,我在想:
解决方案(1)和(2)之间有什么实际区别吗?
例如,
- ...关于回调将在哪个线程上调用?
- ...关于在任务或回调中抛出异常时会发生什么?
- ...还有其他副作用吗?
【问题讨论】:
-
2 只是 1 的通用版本,适用于多种等待类型...
标签: c# task task-parallel-library continuations