鉴于此代码:
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>()
?可取?不值得吗?
答案 0 :(得分:13)
NHibernate默认情况下不支持实体框架意义上的Async await。但是,建议这样做(如果可以的话),因为数据库调用是一个IO调用,这是使其异步的非常好的候选者。因此,在等待来自DB的响应时,您的线程将返回池而不是挂起,它将使您的应用程序更具可伸缩性。 现在来到异步支持。我已经将NHibernate分叉了。 在我称为NHibernateX的fork中,有AsAs方法,如GetAsync,ListAsync,ToListAsync等 这是源和nuget包:
答案 1 :(得分:8)
如果基础操作已经以某种方式异步(即async-await
,BeginXXX
/ 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);
}