首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用TaskFactory.FromAsync调用SOAP Web服务

使用TaskFactory.FromAsync调用SOAP Web服务
EN

Stack Overflow用户
提问于 2013-09-26 14:26:24
回答 1查看 2.4K关注 0票数 1

我有一个带有不同异步方法和它们的completed_eventhandlers的web服务。每当webservice方法完成时,它都会执行其事件处理程序。现在,在我的服务层中,我有一个泛型方法,它将使用Func委托调用这些异步webservice方法。请注意,所有的webservice方法都有相同类型的签名。

请指导我如何使用Task,以便我的服务层方法也是异步的,以便调用这些异步方法,并将从事件处理程序接收到的响应提供给用户。

框架是.NET 4.0

请举一个例子进行指导

EN

回答 1

Stack Overflow用户

发布于 2013-09-26 17:02:43

在APM4.5中,你可以创建一个代理来返回异步调用的任务,而不是.NET风格的方法(BeginX/EndX)

在APM 4中,您可以使用Task.Factory.FromAsync将.NET方法转换为任务。假设您的服务方法接收到单个参数:

代码语言:javascript
运行
复制
public MyResponse MyCall(MyRequest request);

您可以使用如下代码将APM风格的调用(Begin/End)转换为Task:

代码语言:javascript
运行
复制
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

上面的调用等同于:

代码语言:javascript
运行
复制
var ar=client.BeginMyCall(myRequestObject,null,null);
var callTask=Task<MyResponse>.Factory.FromAsync(ar,client.EndMyCall);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19020866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档