从WCF服务调用异步方法
我想从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
方法。 使用异步方法是一个内部问题,不应该在接口中反映出来。
我怎样才能做到这一点?
澄清:
我的问题是在非async
方法中使用await
。 我不希望服务合同发生变化(客户端不一定知道async
是什么),我不想将方法拆分为BeginSomeMethod
和EndSomeMethod
。 我想要一个await
内部使用await
方法。
服务器是使用同步还是异步代码对客户端无关紧要。 客户端和服务器由明确指定的有线协议(通常为SOAP)分隔。 SOAP没有异步完成的概念。
您可以拥有同步服务器和异步客户端,反之亦然。 客户端甚至无法检测服务器是同步还是异步。 这是一个实现细节。 服务器可能是运行Linux的手表,你仍然无法分辨。
您使用的IO样式是一个实现细节,不会影响通过网络的字节数。
所以选择你喜欢的。 客户端仍然可以使用异步IO来访问服务器。
我不确定为什么这对人们来说是如此的惊喜。 在其他情况下,这似乎非常直观:您可以拥有异步TCP服务器和同步客户端。 我可以说new WebClient().DownloadString(url)
并从以异步方式实现的Web服务器同步下载字符串。 我甚至无法分辨出正在运行的服务器软件。
在进行WCF调用时,使用Fiddler查看线路上的内容。 没有同步或异步调用的概念。
在引擎盖下,当您异步调用服务时,WCF客户端库以异步方式使用TCP套接字。 同步调用时,TCP套接字正在与阻塞调用一起使用。 这就是完全不同。
除了同步方法之外,还可以使WCF生成的客户端具有异步方法。 在UI中选择“生成异步操作”选项。 现在你有两个版本。 两者function齐全。
以下是通过实验说服自己的方法:编写同步服务器,并从同一个.NET客户端将其称为同步和异步。 现在异步编写第二个服务器(以您喜欢的任何样式)并使用完全相同的客户端代码来调用它。
无论如何, Task
和IAsyncResult
都不能通过SOAP进行序列化,因此不可能将Task
传输到客户端。
上述就是C#学习教程:从WCF服务调用异步方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/958969.html