【发布时间】:2014-10-30 20:56:13
【问题描述】:
我有以下节点:
class Node
{
public string Name;
public IEnumerable<Node> Children;
}
我有以下扩展方法:
public static class ExtensionMethods
{
public static IEnumerable<Node> TraverseTree(this Node root)
{
if (root.Children != null)
{
foreach (var child in root.Children)
{
var nodes = TraverseTree(child);
foreach (var node in nodes)
{
yield return node;
}
}
}
yield return root;
}
}
我想在树中搜索名为“Foo”的节点。为此,我这样做:
Node myNode = /* some large tree! */
var search = myNode.TraverseTree().Where(x=>x.Name == "Foo").FirstOrDefault();
我有 3 个目标
- 让方法
TraverseTree使用yield (IEnumerable) 遍历树,这样如果第三个节点的名称为== "Foo",那么我就不必遍历整个树。 现在这种情况是真的。 - 让方法
TraverseTree在单独的线程上运行,因为它可能需要很长时间才能找到。所以我猜TraverseTree方法应该带一个callBack参数? - 最后,如果能够取消该操作,那就太好了。我还需要向该方法传递一个取消令牌吗?
这样做的正确方法是什么?
抱歉,我忘了说我使用的是 .Net Framework 4.0
【问题讨论】:
-
这个答案有帮助吗? stackoverflow.com/a/20281941/1210520
标签: c# multithreading callback cancellation