0

1つ疑問があります。以下に示すように、wcf 4.0 サービス メソッドを実装しました。

    IAsyncResult BeginGetData(string userid, AsyncCallback cb, object asyncState)
    {
       // Here i want to call 2 different methods simultaneously of another class

       // string result1 = classA.Method1(userid);
       // string result2 = classA.Method2(userid);        

    }

2 つのメソッドを同時に呼び出し、両方の結果値を同じ return メソッドでクライアントに送り返すにはどうすればよいですか? TPL を使用して実行できますか? TPL では、Task.ContinueWith を使用すると、順次実行されます。これら 2 つのメソッドを並行して実行し、EndGetData メソッドを介して 2 つの結果を返す方法はありますか? Method1 が最初に完了している場合は、Method2 が完了するまで待機する必要があります。または、別の方法として、各メソッドの結果が完了したときにファイアバックすることもできます。これは可能ですか?助けて、私を導いてください。

4

1 に答える 1

1

WCF を使用してこれらすべてを行うことのイントラキャシーについてはわかりません。ContinueWhenAllただし、ここでは Task Parallel Library (TPL) のキーワードを使用できます。

その使用例は、

Task task1 = Task.Factory.StartNew(() => Console.WriteLine("X"));
Task task2 = Task.Factory.StartNew(() => Console.WriteLine("Y"));

これにより、2 つの別個のバックグラウンド スレッド プール スレッドで 2 つのタスクが同時に起動されます。その後、両方の使用が完了するまで待つことができます

var continuation = Task.Factory.ContinueWhenAll(
    new[] { task1, task2 }, tasks => Console.WriteLine("Done!"));

またはここで、WhenAllタスクコンビネータを使用して書くこともできます

var continuation = Task.WhenAll(task1, task2)
    .ContinueWith(ant => Console.Writeline("Done!"));

タスクからデータを返す場合の例:

Task<int> task1 = Task.Factory.StartNew<int>(() => 
    { 
        return SomeSerialMethodReturningInt32A(); 
    });
Task<int> task2 = Task.Factory.StartNew<int>(() => 
    { 
        return SomeSerialMethodReturningInt32B(); 
    });

次に、継続(選択した継続の方法に関係なく)で、次のように結果を照会できます(およびAggregateExceptionsを観察することを忘れないでください)

var continuation = Task.Factory.ContinueWhenAll(
    new[] { task1, task2 }, tasks => 
        { 
            int i = task1.Result;
            int j = task2.Result;
            // Neglecting exception handling.
        });

TPL の優れた紹介については、この CodeProject の記事を参照してください。

これが役立つことを願っています。

于 2013-01-28T10:50:21.413 に答える