【问题标题】:How can I easily support duplicate async/sync methods?如何轻松支持重复的异步/同步方法?
【发布时间】:2014-09-23 22:27:15
【问题描述】:

实体框架具有相同 IO 绑定方法的同步和异步版本,例如 SaveChangesSaveChangesAsync。如何创建新的方法,在不“复制”代码的情况下最少完成相同的任务?

public bool SaveChanges()
{
    //Common code calling synchronous methods
    context.Find(...);

    //Synchronous Save
    return context.SaveChanges();
}

public async Task<bool> SaveChangesAsync()
{
    //Common code asynchronous methods
    await context.FindAsync(...);    

    //Asynchronous Save
    return await context.SaveChangesAsync();
}

【问题讨论】:

    标签: c# entity-framework async-await


    【解决方案1】:

    你不能——至少,不明智。同步和异步实现根本不同。您可以伪造它,通过“同步而不是异步”和“异步超过同步”,但这两种都是反模式,应该避免。

    【讨论】:

    • 是否可以假设 EF 通过复制代码来实现这一点?
    • @Shoe EF完全有可能通过复制代码来实现这一点;我不一定假设它;但是 - 由于它很可能是代码生成和元编程的混合,它可能没问题(即“正确完成”)。
    • 如果我有 cpu-bound 方法而不是 io-bound,那么正确的方法是使用 Task.Run() 之类的方法吗?
    • @Shoe 几乎任何时候你看到同步 IO 操作,在概念层面上,都是同步而不是异步。几乎所有类型的 IO 在概念上都是异步的。它通过阻塞异步操作来实现同步。现在,正如 Marc 所说,您通常可以信任库实现尽其所能做到这一点,从而避免可以避免的问题。
    • 要补充的关键是,有好的方法可以阻止异步,也有不好的方法。例如,如果你有一个Task,调用Wait() 通常是bad - 这可能是一个即时的死锁。因此,为什么同步和异步通常是完全不同的野兽。
    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多