首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF的“正常”接口异步实现

WCF的“正常”接口异步实现
EN

Stack Overflow用户
提问于 2014-02-19 16:26:11
回答 2查看 1.3K关注 0票数 4

我读过的关于为WCF服务执行异步实现的每一篇文章都需要修改WCF服务的接口(例如,操作的返回类型从T到Task)。但是,我不想修改操作签名,因为我的客户端代码对Task<>类型一无所知。我只希望实现是同步的。

我可以通过拥有一个“包装器”方法来实现现有的同步入口点,该方法调用内部异步实现方法,然后执行等待,但这将阻止线程调用到包装器中,这就违背了拥有异步实现的目的(即释放这些线程,以便它们能够为其他请求服务)。

因此,我需要WCF知道实现是异步的,但也知道接口不是异步的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 17:43:01

服务器的"Asyncness“不影响客户端的"Asyncness”。例如,在我正在处理的一个项目中,服务器上有以下内容

代码语言:javascript
复制
[ServiceContract(Namespace = "http://example.com/Example/v1", ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IClientsUploader
{
    [OperationContract()]
    Task<Results> UploadClientsAsync(Database database, Client[] clients);
}

但在客户端我有合同

代码语言:javascript
复制
[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之类的东西来处理该操作。

票数 8
EN

Stack Overflow用户

发布于 2014-02-19 16:32:33

如果客户端可以是回调引用,那么可以使用回调实现来表现为异步调用。您只需将回调契约添加到您的服务契约中,并在客户端上实现。

然后,您可以调用您的服务,在服务器端的操作中,您可以启动一个异步任务(并从调用的操作中立即返回),当任务完成时,您可以通过回调契约接口调用原始客户端。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21886400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档