【问题标题】:WCF: async CTP: is it possible to use?WCF:异步 CTP:可以使用吗?
【发布时间】:2012-04-27 15:07:03
【问题描述】:

我正在尝试将 asyn CTP 与 WCF 一起使用,但我遇到了问题,因为 Task 不可序列化。

我已经安装了 CTP v3。

是否可以将异步 CTP 与 WCF 一起使用?除了只安装 CTP 还需要配置什么吗?

我在想,如果不能使用异步 CTP 喷射,也许不是在服务端使用异步 CTP,我可以使用异步 CTP 实现异步方法,该方法调用服务的正常方法(不是异步方法) .这是一个不错的选择吗?在这种情况下,服务不实现异步方法。

其他选项在服务端,使用开始/结束方法实现异步方法,使用 Task.Factory.FromAsync 方法将这两个方法包装在一个任务中。但这是更多的工作。

所以我的问题是,如果我希望客户端在等待服务响应时不被阻塞,我可以使用两种解决方案。首先在调用服务的普通方法的客户端中使用异步CTP,或者在使用Task.Factory.FromAsync的服务中使用异步方法。哪个是最好的选择?为什么?

谢谢。 戴姆洛克。

【问题讨论】:

    标签: wcf async-ctp


    【解决方案1】:

    我不确定带有异步 CTP 的 VS 2010,但对于 VS 11 Beta(您可能应该使用它),您可以简单地定义一个返回 Task 的操作:

    [OperationContract]
    Task<string> GetData(int value);
    

    然后使用async实现它:

    public async Task<string> GetData(int value)
    {
        return await …;
    }
    

    我认为同样的方法也适用于 Async CTP,但这只是一个假设。

    【讨论】:

    • 如果我使用[OerationContract],我得到的错误是task is cannot be serializable,所以可能CTP与VS2010中的WCF不兼容。
    • 是的,这是可能的。为什么不试试 VS 11?
    • 嗯,VS 11 它仍然是一个测试版,所以在这种情况下它不是一个选项,它将用于生产应用程序。
    • 但是 CTP 甚至比 beta 还小。如果您不想使用非生产质量的东西,那么您当然不应该使用 Async CTP。这就是为什么它被称为社区技术预览
    • 那我错了,因为我认为 CTP 与我在 VS 11 的最终版本中可以获得的版本相同。但我错了,我正在研究 vs 11 选项。谢谢。
    【解决方案2】:

    实现非阻塞客户端调用的最简单方法是在客户端,原因有两个:

    1. 客户端异步方法可以通过现有的VS工具生成
    2. 通过服务边界传递任务需要您编写自己的同步功能。

    为服务生成基于客户端任务(因此与异步/等待兼容)的方法:

    1. 在 VS11 中,存在一个新复选框:“配置服务参考”对话框中“允许生成异步操作”下的“生成基于任务的方法”。 (我相信它还没有记录)
    2. 对于 CTP,您可以使用描述的扩展 here 来生成基于任务的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多