我有.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阻塞。我不能使用等待因为操作合同必须更改为返回任务。如何实现这种情况?
答案 0 :(得分:4)
使用像SaveAsync这样的异步EF操作是否有意义 结束我的服务必须返回T而不是任务(因为老客户)。
是的,它确实有意义,并将提高您的WCF服务的可扩展性。您不必更改合同以利用服务器端的异步API。转换对客户来说完全透明,请查看:
答案 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>
,但您知道该怎么做;)