Оборачиваю голову в ожидании асинхронного и 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:

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

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


если базовая операция не асинхронна каким-либо образом (т. е. 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);
}