延迟执行命令直到满足某些条件

时间:2017-10-23 11:25:51

标签: c# asynchronous delayed-execution

我有一个班级Node

class Node
{
    public string Name { get; private set; }
    public Node Parent { get; private set; }

    ... // some more fields and methods
}

在我的程序开始时,我有一些Node个对象,其Parent个字段都为空。在我的程序过程中,除了一个节点之外的所有节点都将获得父集。但由于它取决于外部因素,我不知道何时会发生这种情况。

现在我有一些Node A并希望运行以下代码:

Node n = A;
while (!n.HasCertainProperty()) // some method returning a bool
    n = n.Parent;
DoStuffWith(n); // some method processing n

如何延迟命令n = n.Parent,直到n.Parent不再为空?

(我的算法是n永远不会是那个没有获得父级的Node;即保证n.Parent != null在某些地方trueNode指出未来。)

这是我的解决方案草图:

首先,我们通过添加事件机制来修改class Node { public string Name { get; private set; } public event EventHandler OnParentSet; private Node _parent; public Node Parent { get { return _parent; } private set { _parent = value; OnParentSet?.Invoke(this, EventArgs.Empty); } } ... // some more fields and methods } 类:

void MyMethod(Node A)
{
    Node n = A;
    if (n.HasCertainProperty())
        DoStuffWith(n);
    else
    {           
        if (n.Parent == null)
            A.OnParentSet += (o, e) => { RunWhenParentIsSet(n); };
        else
            RunWhenParentIsSet(n);
    }
}

void RunWhenParentIsSet(Node n)
{
    n = n.Parent;
    MyMethod(n);
}

然后我们使用以下两种方法代替上面的代码:

Season

但是我不喜欢这个解决方案,因为我必须将while循环转换为递归。是否有办法在不需要转换的情况下或多或少地保留原始代码?

0 个答案:

没有答案