从WCF服务调用异步方法

zmb*_*mbq 4 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;
}
Run Code Online (Sandbox Code Playgroud)

我不想添加asyncIService界面或SomeMethod方法.使用异步方法是一个内部问题,不应该在接口中反映出来.

我怎样才能做到这一点?

澄清:

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

usr*_*usr 17

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

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

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

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

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

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

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

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

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

Task并且IAsyncResult无论如何都不能通过SOAP进行序列化,因此不可能将a Task传输到客户端.

  • 当(异步)服务器完成处理时,它会发送响应.BeginXXX方法完成后,不会发送任何响应.不是一个字节.在服务器上完成EndXXX方法后响应.`一旦SomeMethodStart在服务器上返回,客户端上的EndSomeMethodStart将立即返回.否 - 它在响应到达时返回.服务器完成*all*处理后响应到达.试试吧.与提琴手一起观察. (2认同)
  • @usr,我现在玩了.我确实学到了一些新东西,并且我得到了纠正,非常感谢. (2认同)