环绕我的头等待异步和NHibernate

mxm*_*ile 6 .net c# 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
}
Run Code Online (Sandbox Code Playgroud)

可以ISession.Get<T>()异步调用NHibernate 吗?可取?不值得?

Onu*_*mus 13

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

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

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


i3a*_*non 8

如果底层操作ins't以某种方式(即已经异步async-await,BeginXXX/ EndXXX等)有一个在添加没有价值async围绕它包装.

async在两种情况下有用:可扩展性和响应性.执行async过度同步根本不会对可伸缩性有帮助,而且响应性可以简单地用于在需要时Task.Run将该工作卸载到另一个ThreadPool线程,而不是添加专用方法.

更多内容我应该为同步方法公开异步包装器吗?


Som*_*iwe 6

NHibernate 5现在支持该模式

private ISession _session;

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