环绕我的头等待异步和NHibernate

时间:2015-05-08 17:30:56

标签: c# .net nhibernate async-await

鉴于此代码:

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>()?可取?不值得吗?

3 个答案:

答案 0 :(得分:13)

NHibernate默认情况下不支持实体框架意义上的Async await。但是,建议这样做(如果可以的话),因为数据库调用是一个IO调用,这是使其异步的非常好的候选者。因此,在等待来自DB的响应时,您的线程将返回池而不是挂起,它将使您的应用程序更具可伸缩性。 现在来到异步支持。我已经将NHibernate分叉了。 在我称为NHibernateX的fork中,有AsAs方法,如GetAsync,ListAsync,ToListAsync等 这是源和nuget包:

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

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

答案 1 :(得分:8)

如果基础操作已经以某种方式异步(即async-awaitBeginXXX / EndXXX等),那么添加一个没有价值async包裹它。

async在两种情况下非常有用:可扩展性和响应性。执行 async over sync 根本无法提供可伸缩性,并且对于响应能力,您只需使用Task.Run将该工作卸载到另一个ThreadPool线程您需要而不是添加专用方法。

Should I expose asynchronous wrappers for synchronous methods?

中的更多内容

答案 2 :(得分:6)

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);
}