我读过的关于为WCF服务执行异步实现的每一篇文章都需要修改WCF服务的接口(例如,操作的返回类型从T到Task)。但是,我不想修改操作签名,因为我的客户端代码对Task<>类型一无所知。我只希望实现是同步的。
我可以通过拥有一个“包装器”方法来实现现有的同步入口点,该方法调用内部异步实现方法,然后执行等待,但这将阻止线程调用到包装器中,这就违背了拥有异步实现的目的(即释放这些线程,以便它们能够为其他请求服务)。
因此,我需要WCF知道实现是异步的,但也知道接口不是异步的。
发布于 2014-02-19 17:43:01
服务器的"Asyncness“不影响客户端的"Asyncness”。例如,在我正在处理的一个项目中,服务器上有以下内容
[ServiceContract(Namespace = "http://example.com/Example/v1", ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IClientsUploader
{
[OperationContract()]
Task<Results> UploadClientsAsync(Database database, Client[] clients);
}但在客户端我有合同
[System.ServiceModel.ServiceContractAttribute(Namespace="http://example.com/Example/v1", ConfigurationName="Example.IClientsUploader")]
public interface IClientsUploader
{
[System.ServiceModel.OperationContractAttribute(Action="http://example.com/Example/v1/IClientsUploader/UploadClients", ReplyAction="http://example.com/Example/v1/IClientUploader/UploadClientsResponse")]
Example.DataStructures.Results UploadClients(Example.DataStructures.Database database, System.Collections.Generic.IEnumerable<Example.DataStructures.Client> clients);
}而且效果很好。WCF注意到Task XxxxAsync模式,并将其提交给没有Task<T>返回类型和Async后缀的端点。但是,当一个操作出现时,可以使用它内部的await之类的东西来处理该操作。
发布于 2014-02-19 16:32:33
如果客户端可以是回调引用,那么可以使用回调实现来表现为异步调用。您只需将回调契约添加到您的服务契约中,并在客户端上实现。
然后,您可以调用您的服务,在服务器端的操作中,您可以启动一个异步任务(并从调用的操作中立即返回),当任务完成时,您可以通过回调契约接口调用原始客户端。
https://stackoverflow.com/questions/21886400
复制相似问题