以下代码同时运行2个任务,均设置超时。
层任务(父级)具有总体时间值,当达到该值时,终止该过程。
在层任务中,许多节点任务(子节点)同步循环,因此任务1必须完成才能继续执行任务2等。
如果子任务未能在一个时间范围内完成,则超时并运行下一个子任务。
如果父任务达到超时,则该过程停止,但是当前未完成的子任务仍在后台运行。子任务是第三方Web服务,如果可能的话,我想终止它们以保持清洁。
我已经看了一下微软的例子,但我正在努力让它与我自己的代码一起工作。
简而言之,如果父节点终止,它只能通过超时或异常来终止,我需要取消当前正在运行的子节点。
任何人都知道如何实现这一目标。
public int NestedTask(IEnumerable<KeyValuePair<string, int>> nodes)
{
int parentTimeout = 20 * 1000;
int childTimeout = 2 * 1000;
var tier = Task<int>.Factory.StartNew(() =>
{
foreach (var n in nodes)
{
var node = Task<int>.Factory.StartNew(() =>
{
Thread.Sleep(n.Value * 1000);
return 1;
});
// If we get the result we return it, else we wait
if (node.Wait(childTimeout))
{
return node.Result;
}
}
// return timeout node here;
return -1;
});
if (!tier.Wait(parentTimeout))
{
// The child will continue on running though.
** CANCEL SINGLE CHILD ***
return -2;
}
else if (tier.Exception != null)
{
// We have an error
}
return tier.Result;
}
答案 0 :(得分:0)
只需在子任务声明中指定TaskCreationOptions.AttachedToParent
选项(MSDN)。
var node = Task<int>.Factory.StartNew(() =>
{
Thread.Sleep(n.Value * 1000);
return 1;
}, TaskCreationOptions.AttachedToParent);