我有一个具有不同异步方法及其已完成事件处理程序的 Web 服务。每当 webservice 方法完成时,它都会执行其事件处理程序。现在,在我的服务层中,我有一个通用方法,它将使用 Func 委托调用这些异步 Web 服务方法。请注意所有的网络服务方法都有相同类型的签名。
请指导我如何使用Task,以便我的服务层方法也是异步的,以便调用这些异步方法并将从事件处理程序接收到的响应提供给用户。
框架是.NET 4.0
请举例指导
我有一个具有不同异步方法及其已完成事件处理程序的 Web 服务。每当 webservice 方法完成时,它都会执行其事件处理程序。现在,在我的服务层中,我有一个通用方法,它将使用 Func 委托调用这些异步 Web 服务方法。请注意所有的网络服务方法都有相同类型的签名。
请指导我如何使用Task,以便我的服务层方法也是异步的,以便调用这些异步方法并将从事件处理程序接收到的响应提供给用户。
框架是.NET 4.0
请举例指导
在 .NET 4.5 中,您可以创建一个代理来返回异步调用的任务,而不是 APM 样式的方法(BeginX/EndX)
在 .NET 4 中,您可以使用 Task.Factory.FromAsync 将 APM 方法转换为任务。假设您的服务方法接收一个参数:
public MyResponse MyCall(MyRequest request);
您可以使用这样的代码将 APM 风格的调用(开始/结束)转换为任务:
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);