同步WCF操作的异步实现

本文关键字:异步 实现 操作 WCF 同步 | 更新日期: 2023-09-27 18:09:59

我有。net 4.5 WCF服务。我将重写服务实现,使用EF6访问DB。该服务有许多客户机并处理许多调用。我不能更改服务合同和客户。使用像SaveAsync这样的异步EF操作是否有意义,最后我的服务必须返回T而不是Task(因为旧客户端)。

操作合同示例

[OperationContract]
public object AddEntity(object entity)
{
    using(var context = new MyContext())
    {
        context.Add(entity)
        var task = context.SaveChangesAsync()
        return task.Result;
    }
}

所以即使我使用异步线程也会被task.Result阻塞。我不能使用await,因为操作契约必须更改为返回Task。如何实现这样的场景?

同步WCF操作的异步实现

是否有意义使用异步EF操作像SaveAsync,在end my service必须返回T而不是Task(因为旧客户端)。

是的,它确实有意义,并将提高您的WCF服务的可伸缩性。您不必更改契约来利用服务器端的异步api。转换可以对客户端完全透明,检查如下:

不同形式的WCF服务契约接口

[OperationContract]
public async Task<object> AddEntityAsync(object entity)
{
    using(var context = new MyContext())
    {
        context.Add(entity)
        return await context.SaveChangesAsync();
    }
}

WCF应该检测异步方法,并将正确路由调用,而不需要在客户端进行修改。

我猜SaveChangesAsync返回Task而不是Task<object>但你知道该怎么做;)