绕过我的头等待异步和 NHibernate

Wrapping My Head Around await async and NHibernate

鉴于此代码:

private ISession _session;

public async Task<T> GetAsync<T>(int id) where T : ISomeEntity
{
    //how to call and return _session.Get<T>(id) asynchronous
}

是否可以异步调用 NHibernate ISession.Get<T>()?建议?不值得?

如果底层操作在某种程度上还不是异步的(即 async-awaitBeginXXX/EndXXX 等),则添加 [=13= 没有任何价值] 包裹起来。

async 在两种情况下很有用:可伸缩性和响应能力。在 sync 上执行 async 对可伸缩性根本没有帮助,为了提高响应能力,您可以简单地使用 Task.Run 将该工作卸载到另一个 ThreadPool 线程当您需要而不是添加专用方法时。

Should I expose asynchronous wrappers for synchronous methods?

中的更多内容

NHibernate 不支持 entity framework 默认情况下支持的异步等待。但是,建议这样做(如果可以的话),因为数据库调用是一个 IO 调用,这是使其异步的一个很好的候选者。因此,在等待来自 DB 的响应时,您的线程将 return 进入池而不是被挂起,这将使您的应用程序更具可扩展性。 现在支持异步。我已经分叉 NHibernate 来实现这个。 在我称为 NHibernateX 的分支中,有异步方法,如 GetAsync、ListAsync、ToListAsync 等 这是源代码和 nuget 包:

https://github.com/ReverseBlade/nhibernate-core

https://www.nuget.org/packages/NHibernateX/

NHibernate 5 now support the pattern

private ISession _session;

public async Task<T> GetAsync<T>(int id) where T : ISomeEntity
{
    return await _session.GetAsync<T>(id);
}