使用“普通”接口的WCF异步实现

时间:2014-02-19 16:26:11

标签: c# wcf asynchronous

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

我可以通过一个'wrapper'方法来实现现有的同步入口点,该方法调用内部异步实现方法,然后进行等待,但这会阻塞调用包装器的线程,这会破坏目的具有异步实现(即释放这些线程以便它们可以提供其他请求)。

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

2 个答案:

答案 0 :(得分:8)

服务器的“异步”不会影响客户端的“异步”。例如,在我正在处理的项目上,我在服务器上有以下内容

[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内部的操作来处理操作。

答案 1 :(得分:0)

如果您的客户端可以是回调引用,那么您可以使用回调实现来表现得像异步调用。您只需要在服务合同中添加回调合同并在客户端上实现它。

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