给出以下代码:
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>()
?这样做是否可取?还是不值得?
给出以下代码:
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
等),那么在它周围添加一个async
包装器是没有价值的。
async
有两种用途:可扩展性和响应性。对于可扩展性,使用async
over sync根本没有帮助;对于响应性,您可以简单地使用Task.Run
将工作移交到另一个ThreadPool
线程中,而无需添加专用方法。await
之前,执行在调用线程上。在 await
之后,通常会在 ThreadPool
线程或 UI 线程上。重要的是在其间发生的事情。当 (真正的) async
操作正在执行时,根本没有线程。但是这里没有要 await
的任务。您可以使用 Task.Run
创建一个任务,但这将在整个操作期间阻塞 ThreadPool
线程。 - i3arnonasync
意味着一个异步包装器,没有必要添加。当然,如果你直接从 UI 代码中使用 Task.Run
,并且这样做有意义,那么你可以等待它。 - i3arnonNHibernate 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);
}