如果父任务超时,如何取消子任务

本文关键字:取消 子任务 何取消 任务 超时 如果 | 更新日期: 2023-09-27 18:29:22

下面的代码同时运行两个任务,都有一个设置的超时。

层任务(父任务)具有一个总timout值,当达到该值时,将终止进程。

在分层任务中,许多节点任务(子任务)同步循环,因此任务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;
    }

如果父任务超时,如何取消子任务

只需在子任务声明中指定TaskCreationOptions.AttachedToParent选项(MSDN)。

var node = Task<int>.Factory.StartNew(() =>
{
    Thread.Sleep(n.Value * 1000);
    return 1;
}, TaskCreationOptions.AttachedToParent);