我有一个疑问。我实现了我的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完成。或者另一种方法是在完成每个方法结果时将其激活。这可能吗 ?请帮助并指导我。
答案 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。
我希望这会有所帮助。