【问题标题】:Async implementation of synchronous WCF operation同步WCF操作的异步实现
【发布时间】:2014-06-23 11:25:59
【问题描述】:

我有 .net 4.5 WCF 服务。我将重写服务实现以使用 EF6 访问数据库。该服务有许多客户并处理许多呼叫。我不能更改服务合同和客户。使用 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 阻塞。我不能使用等待,因为必须更改操作合同才能返回任务。如何实现这样的场景?

【问题讨论】:

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


    【解决方案1】:

    使用 SaveAsync 等异步 EF 操作是否有意义? 结束我的服务必须返回 T 而不是 Task(因为旧客户端)。

    是的,它确实有意义,并且会提高 WCF 服务的可扩展性。您无需更改合同即可利用服务器端的异步 API。转换可以对客户端完全透明,请检查:

    Different forms of the WCF service contract interface

    【讨论】:

    • 请您查看我的样品吗?我错过了什么?如何在这里实现异步操作?
    • @KonradSikorski,您可以使用 Guillaume 发布的代码。您无需更改甚至重新编译客户端代码。请注意,在这种情况下,客户端和服务器上的异步是完全独立的。
    【解决方案2】:
    [OperationContract]
    public async Task<object> AddEntityAsync(object entity)
    {
        using(var context = new MyContext())
        {
            context.Add(entity)
            return await context.SaveChangesAsync();
        }
    }
    

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

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

    【讨论】:

    • 我不应该使用 context.SaveChangesAsync().ConfigureAwait(false) 吗?
    • @KonradSikorski,这取决于您的环境以及您在 SaveChangesAsync() 之后执行的操作。如果您什么都不做或不使用上下文,我认为 ConfigureAwait(false) 是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2016-01-02
    • 1970-01-01
    • 2010-12-25
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多