异步实现同步WCF操作

时间:2014-06-23 11:25:59

标签: c# .net entity-framework wcf async-await

我有.net 4.5 WCF服务。我将重写服务实现以使用EF6访问数据库。此服务有许多客户端并处理许多呼叫。我不能改变服务合同和客户。使用像SaveAsync这样的异步EF操作是否有意义,最后我的服务必须返回T not Task(因为旧客户端)。

更新

Exaple运营合同

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

        return task.Result;
    }
}

所以,即使我正在使用异步,线程将被task.Result阻塞。我不能使用等待因为操作合同必须更改为返回任务。如何实现这种情况?

2 个答案:

答案 0 :(得分:4)

  

使用像SaveAsync这样的异步EF操作是否有意义   结束我的服务必须返回T而不是任务(因为老客户)。

是的,它确实有意义,并将提高您的WCF服务的可扩展性。您不必更改合同以利用服务器端的异步API。转换对客户来说完全透明,请查看:

Different forms of the WCF service contract interface

答案 1 :(得分: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<object>,但您知道该怎么做;)