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

Ter*_*tta 4 c# wcf asynchronous

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

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

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

Sco*_*ain 8

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

[ServiceContract(Namespace = "http://example.com/Example/v1", ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IClientsUploader
{
    [OperationContract()]
    Task<Results> UploadClientsAsync(Database database, Client[] clients);
}
Run Code Online (Sandbox Code Playgroud)

但在客户端我有合同

[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);
}
Run Code Online (Sandbox Code Playgroud)

它完美无缺.WCF注意到Task XxxxAsync模式并将其转换为端点而没有Task<T>返回类型和Async后缀.然而,当操作进入时,可以使用await内部的操作来处理操作.