绕过我的头等待异步和 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-await
、BeginXXX
/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 包:
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);
}
鉴于此代码:
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-await
、BeginXXX
/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 包:
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);
}