0

我有一个疑问。我实现了我的 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,它将按顺序运行。有什么方法可以并行运行这 2 个方法并通过 EndGetData 方法返回 2 个结果?如果 Method1 先完成,那么它应该等待 Method2 完成。或者另一种方法是在每个方法结果完成时回火它们。这可能吗 ?请帮助和指导我。

4

1 回答 1

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的 s),如下所示

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 回答