在异步wcf服务方法中使用TPL并行工作

时间:2013-01-28 10:42:43

标签: wcf parallel-processing task-parallel-library

我有一个疑问。我实现了我的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个方法,并且两个结果值都以相同的返回方法发送回客户端?我们可以使用TPL吗?在TPL中,如果我们使用Task.ContinueWith,它将按顺序运行。有没有办法平行运行这两个方法并通过EndGetData方法返回2个结果?如果Method1首先完成,那么它应该等待Method2完成。或者另一种方法是在完成每个方法结果时将其激活。这可能吗 ?请帮助并指导我。

1 个答案:

答案 0 :(得分:1)

我不确定使用WCF为您完成所有这些操作的内容。但是,在这里您可以使用任务并行库(TPL)ContinueWhenAll关键字:

其用法的一个例子是

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

这会在两个单独的后台线程池线程上同时关闭两个任务。然后,您可以等待两者完成

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(); 
    });

然后在继续(您选择的任何延续方法)中,您可以查询结果(并记住观察您的AggregateException),如下所示

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

有关TPL的详细介绍,请参阅this CodeProject article

我希望这会有所帮助。