异步实现同步WCF操作

4
我有一个基于.NET 4.5的WCF服务。我将重写服务实现,使用EF6来访问数据库。该服务有许多客户端并处理许多调用。我不能更改服务契约和客户端。使用异步EF操作(如SaveAsync)是否有意义,因为我的服务最终必须返回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。如何实现这种情况?

2个回答

4

使用异步EF操作如SaveAsync是否有意义,因为我的服务最终必须返回T而不是Task(因为老客户端)。

是的,这是有意义的,并且将提高您的WCF服务的可伸缩性。您不必更改契约以利用服务器端的异步API。转换可以对客户端完全透明,请检查此内容:

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


请您能否审核我的样例?我漏掉了什么?如何在这里实现异步操作? - Konrad
1
@KonradSikorski,你可以使用Guillaume发布的代码。你不需要更改或重新编译客户端代码。请注意,在此情况下,客户端和服务器上的异步性是完全独立的。 - noseratio - open to work

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

WCF应该检测异步方法,并且在客户端不需要进行任何修改的情况下正确路由调用。 我猜测`SaveChangesAsync`返回一个`Task`而不是一个`Task`,但你知道该怎么做;)

我应该不使用context.SaveChangesAsync().ConfigureAwait(false)吗? - Konrad
@KonradSikorski,这取决于您的环境以及在SaveChangesAsync()之后要执行的操作。如果您什么也不做或者不使用上下文,我认为ConfigureAwait(false)是可以的。 - Guillaume

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接