【发布时间】:2016-09-19 18:09:21
【问题描述】:
我必须在每次循环中使用不同的参数调用一个 web 服务方法大约一百次。 网络服务只有同步方法。目前我正在控制台应用程序中对此进行测试,同步执行时需要十多分钟才能获取数据!
我想要什么: 并行运行 10 个请求。当他们完成后,执行接下来的十次调用。 这当然应该是异步的。
该功能将托管在 IIS 托管的 wcf 服务中。
概述: 客户端使用参数调用 wcf 服务一次。 wcf 服务方法应该异步调用另一个 web 服务一百次,并将最终数据保存到 Excel。
我读到,Task.Run 在 Web 应用程序中使用时不是一个好主意。
那么,如何在 Web 上下文中异步调用同步 Web 服务方法?
我正在使用CRM Microsoft.Xrm.Sdk,Version=7.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35
var orders = _serviceProxy.RetrieveMultiple( new FetchExpression(strXmlFetch));
RetrieveMultiple 获取定义查询并执行请求的 xml 片段 (strXmlFetch)。 该方法驻留在此处:
命名空间 Microsoft.Xrm.Sdk.Client
类 OrganizationServiceProxy
public EntityCollection RetrieveMultiple(QueryBase query);
在后台,客户端 SDK 在调用 RetrieveMultiple 时会执行以下操作。
using (OrganizationServiceContextInitializer organizationServiceContextInitializer = new OrganizationServiceContextInitializer(this))
{
entityCollection = base.ServiceChannel.Channel.RetrieveMultiple(query);
return entityCollection;
}
我还没有实现任何东西,因为我需要一个异步执行请求的起点。
【问题讨论】:
-
你可以使用 Parallel.ForEach (msdn.microsoft.com/en-us/library/…)
-
@Evk Parallel API for Network IO,绝对不是一个好主意,会浪费资源,它应该是 Async-Await,内部调用同步方法,或者如果可用则可能是异步
-
但是 OP 说他的网络服务只有同步方法。当然,最好利用异步 IO,但问题表明这是不可能的。如果您将使用 async\await 和 Task.Run 调用此同步方法 - 将不会改变任何内容。
-
为什么不能调用它,只是它需要在 Sync 上使用 Async 包装器,这是 Anti Pattern,但这是使用 Async-Await 异步调用同步方法的唯一方法
-
你能给我们看一些客户端的代码吗?我对 Web 服务如何完全同步感到困惑。客户端正在点击 URL 并等待响应 - 从客户端的角度来看,这绝对可以是异步的
标签: c# web-services asynchronous task