如何在C#中选择异步调用的方法,如何传播异步
我很少用异步方式编写程序问题。我正在使用一些昂贵的方法编写WCF服务,这些方法很适合异步调用。但我对实施的问题是:如何在C#中选择异步调用的方法,如何传播异步,c#,.net,wcf,asynchronous,async-await,C#,.net,Wcf,Asynchronous,Async Await,我很少用异步方式编写程序问题。我正在使用一些昂贵的方法编写WCF服务,这些方法很适合异步调用。但我对实施的问题是: 如果我要在模型中创建异步方法,那么我需要将服务方法标记为异步,以便能够等待模型方法,并将返回类型更改为Task。这将破坏服务API约定的一致性。正确的道路是什么?将服务接口设计为async Task返回方法是否更好,即使某些方法并不昂贵,并且实际上没有理由使其异步 据我所知,只有昂贵的方法才应该写为异步,但在这种情况下,程序的一半是同步的,另一半是异步的。是这样吗 如果有“昂贵”的
Task
。这将破坏服务API约定的一致性。正确的道路是什么?将服务接口设计为async Task
返回方法是否更好,即使某些方法并不昂贵,并且实际上没有理由使其异步李>
如果有“昂贵”的方法,我不会说您需要
asyncwait
。更好的指导原则是在存在真正的异步操作(主要是IO调用)时使用async wait
如果您有许多这样的操作,那么在整个运行时持有线程将是一种浪费,并且会严重阻碍可伸缩性。这是一种权衡,你需要自己决定什么对你更重要:简单性还是可伸缩性
如果您的应用程序是一个富客户端,那么可伸缩性可能没有那么重要,但是在WCF
服务中,如果可以,我总是选择异步选项
如果要在模型中创建async方法,则需要将服务方法标记为async,以便能够等待模型方法,并将返回类型更改为Task。这将破坏服务api约定的一致性。正确的道路是什么?将服务接口设计为异步任务返回方法是否更好,即使某些方法并不昂贵,并且实际上没有理由将其设为asnyc
在WCF中,当您更改方法以返回任务时,实际上并没有更改WCF协定,因为它可以为单个消息标识多个异步模式,这意味着您可以在单个协定接口中包含所有3个模式(任务、同步和APM),并且它们都与同一消息相关
发件人:
客户可以向开发人员提供他们选择的任何编程模型,因此
只要观察到底层消息交换模式。所以呢,,
服务能否以任何方式实现操作,只要
观察到指定的消息模式
本主题将在和中扩展
据我所知,只有昂贵的方法才应该写为异步,但在这种情况下,程序的一半是同步的,另一半是异步的。是这样吗
正如@l3arnon所说,公开一个async
api与方法的“成本”无关,而是与方法调用所做的工作有关。如果它是真正的异步工作,例如访问文件系统、发送网络请求、访问外部数据源(如数据库),那么这是公开异步api的合适人选
将这些事实与WCF结合起来,您可以通过单个契约公开同步和异步方法
IAsyncResult
无论如何都不能通过SOAP序列化,因此不可能将任务
传输到客户端李>
在GUI应用程序中,您不希望为长时间运行的同步(例如CPU绑定)操作阻塞UI线程,因此在那里使用类似
wait Task.Run()
的东西是有意义的。但这不适用于WCF服务或类似服务。@svick确实如此