У меня есть следующие функции асинхронной в C#:Асинхронный внутри Использование блока
private async Task<T> CallDatabaseAsync<T>(Func<SqlConnection, Task<T>> execAsync)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
return await execAsync(connection);
}
}
Это позволяет выполнять любые асинхронной функции execAsync, который принимает соединение SQL в качестве аргумента и использует его, чтобы сделать запрос к базе данных, с помощью обеспечивая объект соединения и обеспечив его надлежащее закрытие.
Эта функция затем вызывается из действия в контроллере WebAPI следующим образом:
public async Task<HttpResponseMessage> MyAction()
{
Func<SqlConnection, Task<SomeType>> execAsync = (function definition here);
await CallDatabaseAsync(execAsync);
return Request.CreateResponse(HttpStatusCode.OK);
}
Это все работает замечательно, пока я не сделать одно изменение в действие WebAPI: Я удалить асинхр/ждут от него. Я не хочу ждать вызова базы данных, потому что меня не волнует результат, я просто хочу запустить и забыть.
Это все еще работает нормально - т. Е. Если я перейду к URL-адресу действия в браузере, я не получу никаких ошибок. Но на самом деле есть проблема - соединение с базой данных не закрывается. После 100 вызовов этого действия пул соединений достигает предела по умолчанию 100, и приложение перестает работать.
Что я делаю неправильно? Что мне нужно изменить в CallDatabaseAsync(), так что он абсолютно гарантирует, что соединение будет закрыто, несмотря ни на что?
Вы уверены, что это соединение, что оно не закрывается? –
@PauloMorgado Довольно уверен. Все вызовы базы данных проходят через ** CallDatabaseAsync() **, и это конкретное действие контроллера вызывает ** CallDatabaseAsync() ** только один раз. – Andrew
Не могли бы вы показать пример async func, который вы передаете этому родовому исполнителю? –