Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中选择异步调用的方法,如何传播异步_C#_.net_Wcf_Asynchronous_Async Await - Fatal编程技术网

如何在C#中选择异步调用的方法,如何传播异步

如何在C#中选择异步调用的方法,如何传播异步,c#,.net,wcf,asynchronous,async-await,C#,.net,Wcf,Asynchronous,Async Await,我很少用异步方式编写程序问题。我正在使用一些昂贵的方法编写WCF服务,这些方法很适合异步调用。但我对实施的问题是: 如果我要在模型中创建异步方法,那么我需要将服务方法标记为异步,以便能够等待模型方法,并将返回类型更改为Task。这将破坏服务API约定的一致性。正确的道路是什么?将服务接口设计为async Task返回方法是否更好,即使某些方法并不昂贵,并且实际上没有理由使其异步 据我所知,只有昂贵的方法才应该写为异步,但在这种情况下,程序的一半是同步的,另一半是异步的。是这样吗 如果有“昂贵”的

我很少用异步方式编写程序问题。我正在使用一些昂贵的方法编写WCF服务,这些方法很适合异步调用。但我对实施的问题是:

  • 如果我要在模型中创建异步方法,那么我需要将服务方法标记为异步,以便能够等待模型方法,并将返回类型更改为
    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序列化,因此不可能将
    任务
    传输到客户端
  • 不是“昂贵”,而是长时间运行的IO绑定。服务器上异步的好处是避免线程被阻塞。这会暂时节省1MB的堆栈空间和一个线程池插槽。如果您不需要此增益,而大多数工作负载不需要,请不要使用异步。从开发的角度来看,异步并不是免费的

  • 在GUI应用程序中,您不希望为长时间运行的同步(例如CPU绑定)操作阻塞UI线程,因此在那里使用类似
    wait Task.Run()
    的东西是有意义的。但这不适用于WCF服务或类似服务。@svick确实如此async await是关于可伸缩性的,而在GUI应用中,它是关于卸载的。选择作为与问题最佳匹配的答案。但所有答案都非常有用。谢谢你们。