c# - TaskContinuationOptions.AttachedToParent 的理解
问题描述
MSDN 说的用法TaskContinuationOptions.AttachedToParent
:
指定延续(如果它是子任务)附加到任务层次结构中的父级。只有当它的前件也是子任务时,延续才可以是子任务。
以下是一些代码和我对其用法的理解,如果我错了,请纠正我:
class Program
{
static void Main(string[] args) {
Task<Int32[]> parent = new Task<Int32[]>(() => {
var results = new Int32[4];
// ugly syntax, just for demo purpose
Task child1 = new Task(() => results[0] = Sum(10000), TaskCreationOptions.AttachedToParent);
Task child2 = new Task(() => results[1] = Sum(20000), TaskCreationOptions.AttachedToParent);
Task child3 = new Task(() => results[2] = Sum(30000), TaskCreationOptions.AttachedToParent);
Task child4 = new Task(() => results[2] = Sum(40000), TaskCreationOptions.AttachedToParent);
Task childX = child4.ContinueWith(child4Task => Console.WriteLine("child4 done"), TaskContinuationOptions.AttachedToParent);
child1.Start();
child2.Start();
child3.Start();
child4.Start();
return results;
});
// When the parent and its children have run to completion, display the results
parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));
parent.Start();
}
static Int32 Sum(Int32 n) {
Int32 sum = 0;
for (; n > 0; n--)
checked { sum += n; }
return sum;
}
}
我有两个问题:
Q1-我的理解TaskContinuationOptions.AttachedToParent
是,当我这样做时Task childX = child4.ContinueWith(child2Task => Console.WriteLine("child4 done"), TaskContinuationOptions.AttachedToParent);
,childX
就像一个孩子5 parent
,所以childX
会在完成之前parent
完成。
但是如果我不使用标志作为Task childX = child4.ContinueWith(child2Task => Console.WriteLine("child4 done"));
那么childX
不被认为是的孩子parent
,因此childX
可以在完成后parent
完成,我的理解是否正确?
Q2-TaskContinuationOptions.AttachedToParent
如果任务本身不是子任务,则没有意义,例如,如果我执行parent
为:
parent.ContinueWith(..., TaskContinuationOptions.AttachedToParent);
parent.Start();
那么这行代码就没有意义了,是吗?如果它没有意义,因为它没有父级,那么 CLR 应该抛出一个异常,说“XXX 没有父级任务等等等等”,但是 CLR 没有抛出这样的异常,为什么?
解决方案
推荐阅读
- python - 通过 PHP 适配 Ansible-Vault
- typescript - 带有 express、nodemon 和 jest 的 TypeScript --watch
- python - 如果他们具有特定角色,我正在尝试向不和谐频道中的每个人发送私人消息
- emulation - 6502 上的中断行为
- keycloak - 仅向特定用户提供 Keycloak 中的“忘记密码”功能
- python - 这个 python 代码的输出是什么?我很困惑
- javascript - 添加 defer 到 Scripts functions.php
- javascript - .each() 只迭代一次,或者返回 undefined
- python - 在 python 中制作 Plotly 图形移动响应
- mongodb - 使用 Mongodb.Driver 从 Mongodb 中检索不同的值