0

ノードの子をロードする関数があります。内部的には、WCF非同期サービスを呼び出してロードします。署名は次のとおりです。

public void AddChildElements(Node parentElement, 
                                    Action<IEnumerable<Node>> callback)
{

}

これは次のように使用できます

_nodeBuilder.AddChildElements(parentElement, (elements) =>
              {
                 //do something with elements 
              });

次に、ある条件に基づいて階層を拡張する関数を作成します。だから私はこのような拡張関数を書きます

public static T LoadHierarchyUntilItemFound<T>(
         this  IEnumerable<T> sequence, Func<T, List<T>> loadaction, 
         Func<T, string> searchstring)
{
  //...
}

loadactionパラメーターは、ノードのロード関数を想定しています。使用法は次のとおりです。

 Elements.LoadHierarchyUntilItemFound(LoadChildren,                               
                                   "root.UK.England.London"); 

問題は、ロード関数をどのように作成するかです。

  private List<Node> LoadChildren(Node parent)
   {
           // _nodeBuilder.AddChildElements(parent, here it expects a callback 
                        //which gives the result, how to use this?); 
   }

要するに、問題は、どのようにコールバック関数を使用してラッパー関数の結果を返すことができるかということです。

4

1 に答える 1

1

本当に必要な場合は、asyncメソッドを呼び出して、次が返されるまでブロックする関数を作成することできます。

private List<Node> LoadChildren(Node parent)
{
    var tcs = new TaskCompletionSource<IEnumerable<Node>>();

    AddChildElements(parent, nodes => tcs.SetResult(nodes));

    return tcs.Task.Result.ToList();
}

ただし、多くの場合、同期ではなく非同期でこのすべてを実行することが望ましいでしょう。

public static async Task<T> LoadHierarchyUntilItemFoundAsync<T>(
    this  IEnumerable<T> sequence, Func<T, Task<IEnumerable<T>>> loadaction,
    Func<T, string> selector, string searchstring)
{
    var stack = new Stack<T>(sequence);
    while (stack.Any())
    {
        var item = stack.Pop();

        if (selector(item) == searchstring)
            return item;

        foreach (var child in await loadaction(item))
        {
            stack.Push(child);
        }
    }

    return default(T);
}

そのような関数が与えられた場合、次を使用して呼び出すことができます。

Elements.LoadHierarchyUntilItemFound(AddChildElements,                               
                               "root.UK.England.London"); 
于 2013-02-05T19:15:04.390 に答える