Оборачиваю голову в ожидании асинхронного и 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>()
асинхронно? Желательно? Не стоит?
3 ответов
NHibernate не поддерживает async await в смысле Entity framework по умолчанию. Однако было бы рекомендовано сделать это (если бы вы могли), так как вызов базы данных является вызовом ввода-вывода, который является очень хорошим кандидатом на асинхронность. В результате во время ожидания ответа от DB ваш поток вернется в пул вместо того, чтобы быть pend, и это сделает ваше приложение более масштабируемым. Теперь перейдем к поддержке async. Я раздвоил NHibernate, чтобы достичь этого. В моей вилке, которую я называю NHibernateX, есть являются асинхронными методами, такими как GetAsync, ListAsync, ToListAsync и т. д Вот источник и пакет nuget:
если базовая операция не асинхронна каким-либо образом (т. е. async-await
, BeginXXX
/EndXXX
, etc.) нет смысла добавлять async
обертка вокруг него.
async
полезно в 2 случаях: масштабируемость и отзывчивость. Делать async
over sync не помогает с масштабируемостью вообще и для отзывчивости вы можете просто использовать Task.Run
чтобы разгрузить эту работу на другую ThreadPool
поток, когда вам нужно вместо добавления выделенного метод.
больше должен ли я выставлять асинхронные оболочки для синхронных методов?
NHibernate 5 теперь поддерживает шаблон
private ISession _session;
public async Task<T> GetAsync<T>(int id) where T : ISomeEntity
{
return _session.GetAsync<T>(id);
}