我有一个带有不同异步方法和它们的completed_eventhandlers的web服务。每当webservice方法完成时,它都会执行其事件处理程序。现在,在我的服务层中,我有一个泛型方法,它将使用Func委托调用这些异步webservice方法。请注意,所有的webservice方法都有相同类型的签名。
请指导我如何使用Task,以便我的服务层方法也是异步的,以便调用这些异步方法,并将从事件处理程序接收到的响应提供给用户。
框架是.NET 4.0
请举一个例子进行指导
发布于 2013-09-26 09:02:43
在APM4.5中,你可以创建一个代理来返回异步调用的任务,而不是.NET风格的方法(BeginX/EndX)
在APM 4中,您可以使用Task.Factory.FromAsync将.NET方法转换为任务。假设您的服务方法接收到单个参数:
public MyResponse MyCall(MyRequest request);
您可以使用如下代码将APM风格的调用(Begin/End)转换为Task:
var myRequestObject =...;
var callTask=Task<MyResponse>.Factory.FromAsync(
client.BeginMyCall,
client.EndMyCall,
myRequestObject,
null); // The state object, typically not used
要使用更多参数,请使用接受更多参数的重载之一(最多3个)
多个FromAsync重载可能会非常令人困惑,编译器可能会抱怨找不到泛型参数的类型。
诀窍是理解第一个参数只需要IAsyncResult对象,而第二个参数需要处理最终结果的函数。即使是接受Func<>作为第一个参数的重载,也要立即运行它并继续使用IAsyncResult
上面的调用等同于:
var ar=client.BeginMyCall(myRequestObject,null,null);
var callTask=Task<MyResponse>.Factory.FromAsync(ar,client.EndMyCall);
https://stackoverflow.com/questions/19020866
复制