从WCF服务调用异步方法

时间:2014-03-23 11:25:23

标签: c# wcf asynchronous async-await

我想从WCF服务调用异步方法,例如:

[ServiceContract]
interface IService
{
    [OperationContract]
    int SomeMethod(int data);
}

int SomeMethod(int data)
{
    var query = ... build LINQ query;
    var response = await query.ToListAsync();
    return response.Length;
}

我不想将async添加到IService界面或SomeMethod方法。使用异步方法是一个内部问题,不应反映在界面中。

我该怎么做?

澄清:

我的问题是在非await方法中使用async。我不希望服务合同发生变化(客户端不一定知道async是什么),我不想将方法拆分为BeginSomeMethodEndSomeMethod。我想要一种在内部使用await 的方法。

1 个答案:

答案 0 :(得分:17)

服务器是使用同步还是异步代码对客户端无关紧要。客户端和服务器由明确指定的有线协议(通常为SOAP)分隔。 SOAP没有异步完成的概念。

您可以拥有同步服务器和异步客户端,反之亦然。 客户端甚至无法检测服务器是同步还是异步。这是一个实现细节。服务器可能是运行Linux的手表,你仍然无法分辨。

您使用的IO样式是一个实现细节,不会影响通过网络传输的字节。

所以选择你喜欢的。客户端仍然可以使用异步IO来访问服务器。

我不确定为什么这对人们来说是如此的惊喜。在其他情况下,这似乎非常直观:您可以拥有异步TCP服务器和同步客户端。我可以说new WebClient().DownloadString(url)并从以异步方式实现的Web服务器同步下载字符串。我甚至无法说出正在运行的服务器软件。

在进行WCF调用时,使用Fiddler查看线路上的内容。没有同步或异步调用的概念。

在幕后,当您异步调用服务时,WCF客户端库以异步方式使用TCP套接字。当您同步调用时,TCP套接字正在与阻塞调用一起使用。这就是完全不同。

除了同步方法之外,还可以使WCF生成的客户端具有异步方法。在UI中选择“生成异步操作”选项。现在你有两个版本。两者都功能齐全。

以下是通过实验说服自己的方法:编写同步服务器,并从同一个.NET客户端将其称为同步和异步。现在异步编写第二个服务器(以任何你喜欢的方式)并使用完全相同的客户端代码来调用它。

无论如何,

TaskIAsyncResult都不能通过SOAP序列化,因此不可能将Task传输到客户端。