Fan*_*nda 4 .net c# wcf asynchronous async-await
我几乎没有编写程序问题的异步方式.我正在用一些昂贵的方法编写WCF服务,这些方法非常适合异步调用.但我对这些实现的问题是:
Task<originalType>.这将破坏服务API约定的一致性.什么是正确的方法?将服务接口设计为async Task返回方法是否更好,即使某些方法并不昂贵且实际上没有理由使其异步?async-await当有"昂贵"的方法时,我不会说你需要.更好的指导是async-await在真正的异步操作(主要是IO调用)时使用.
如果您有许多这样的操作,那么在整个运行时期间持有一个线程将是一种浪费,并且它会严重阻碍可伸缩性.这是一个权衡,你需要自己决定什么对你更重要:简单性或可扩展性.
如果您的应用程序是一个丰富的客户端,可扩展性也许不是那重要,但在WCF服务,我会一直,如果我可以选择同步选项.
如果我将在模型中创建异步方法,那么我需要将服务方法标记为async以便能够等待模型方法,并将返回类型更改为Task.这将破坏服务api约定的一致性.什么是正确的方法?将服务接口设计为异步任务返回方法是否更好,即使某些方法并不昂贵且实际上没有理由使其成为asnyc?
在WCF中,当您更改方法以返回a时Task<T>,您实际上并未更改WCF合同,因为它可以识别单个消息的多个异步模式,这意味着您可以拥有所有3个模式(任务,同步和APM)一个合同接口,它们都与同一个消息有关.
来自MSDN:
只要观察到基础消息交换模式,客户端就可以为开发人员提供他们选择的任何编程模型.因此,只要遵守指定的消息模式,服务也可以以任何方式实现操作.
本主题涵盖在不同形式的WCF服务契约接口和异步使用同步WCF服务中
据我所知,只有昂贵的方法应该写成async,但在这种情况下,程序的一半将是同步的,第二个是异步的.这样对吗?
正如@ l3arnon所说,暴露asyncapi不是关于方法的"昂贵",而是关于方法调用正在做的工作.如果它真正的异步工作,如访问文件系统,发送网络请求,访问外部数据源,如数据库,那么这是一个适合公开异步api的候选者.
将这些事实与WCF结合使用,您可以通过单个合同公开同步和异步方法.