【问题标题】:WCF - AsyncPattern=true or IsOneWay=trueWCF - AsyncPattern=true 或 IsOneWay=true
【发布时间】:2011-01-11 16:08:20
【问题描述】:

我的 WCF 服务中很少有方法需要花费大量时间 - 生成报告和发送电子邮件。

根据目前的要求,要求Client应用程序只是提交请求,而不是等待整个过程完成。它将允许用户继续在客户端应用程序中执行其他操作,而不是等待整个过程完成。

我不知道该走哪条路:

AsyncPattern = true OR  
IsOneWay=true 

请指导。

【问题讨论】:

    标签: wcf asynchronous


    【解决方案1】:

    两者都可以。

    通常我认为 WCF 操作没有理由是异步的,除了开发人员懒惰。


    你不应该比较它们,因为它们没有可比性。

    简而言之,AsyncPattern=True 执行异步调用,无论您是否返回值。

    OneWay 仅适用于 void 方法,并在您的线程上加锁,等待接收者确认收到消息。

    【讨论】:

    • 感谢您的回复,您能否告诉我们 AsyncPattern = true 相对于 IsOneWay=true 的优势是什么?
    • Okie...好吧,我想在其上实现异步/单向的所有服务方法都返回 void。据我了解,在 IsOneWay 中,线程不会被锁定以完成整个过程,如果我错了,请更正。你有什么好的理由让我在这里使用 AsyncPattern=True 吗?谢谢!
    • IsOneWay 确实会锁定您的线程。唯一的区别是它不会等待整个操作在服务器端完成。它一直等到服务器端确认它收到了整个消息。
    • 我认为锁定时间应该最短,因为我使用的是 netTcpBinding。我只是想在我的一些服务方法上使用 IsOneWay,如stackoverflow.com/questions/2176701/…。但似乎我遗漏了一些东西,如果我在上面的链接中弄错了,请您提出建议。
    • 可能与您使用的绑定有关。 WCF 是一个复杂的依赖关系,通常很难说是什么影响了什么。
    【解决方案2】:

    我知道这是一篇旧帖子,但 IMO 在您的场景中您应该使用 IsOneWay,因为您不关心服务器结果是什么。根据您是否需要最终通知客户端(例如服务器作业完成或失败),您可能还需要考虑更改接口以使用 SessionMode=required,然后使用双工绑定。

    即使您确实想使用异步双向通信,因为您的客户端 DID 关心结果,但仍有不同的概念:

    • AsyncPattern=true 在服务器上 - 您这样做是为了释放服务器资源,例如如果底层资源(用于报告的?SSRS、邮件 API 等)支持异步操作。但这将有利于服务器,而不是客户端。
    • 在客户端上,您始终可以在选中“生成异步操作”的情况下生成服务引用代理 - 在这种情况下,您的客户端不会阻塞,并且会在操作完成时使用回调。

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多