我在C#中有以下异步函数:
private async Task<T> CallDatabaseAsync<T>(Func<SqlConnection, Task<T>> execAsync)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
return await execAsync(connection);
}
}
Run Code Online (Sandbox Code Playgroud)
它允许执行任何异步函数execAsync,它将SQL连接作为参数并通过提供连接对象并确保它将被正确关闭来使用它来进行数据库调用.
然后从WebApi控制器中的操作调用此函数,如下所示:
public async Task<HttpResponseMessage> MyAction()
{
Func<SqlConnection, Task<SomeType>> execAsync = (function definition here);
await CallDatabaseAsync(execAsync);
return Request.CreateResponse(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有效,直到我对WebApi操作进行了一次更改:我从中删除了异步/等待.我不想等待数据库调用,因为我不关心结果,我只是想解雇并忘记.
这仍然似乎工作正常 - 即如果我在浏览器中导航到操作的URL我没有得到任何错误.但实际上有一个问题 - 数据库连接没有关闭.在100次调用操作后,连接池达到其默认限制100,并且应用程序停止工作.
我究竟做错了什么?我需要在CallDatabaseAsync()中进行哪些更改,以便绝对确保连接将被关闭,无论如何?
我试图转换此方法,将对象反序列化为使用Async/Await的字符串.
public static T DeserializeObject<T>(string xml)
{
using (StringReader reader = new StringReader(xml))
{
using (XmlReader xmlReader = XmlReader.Create(reader))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
T theObject = (T)serializer.ReadObject(xmlReader);
return theObject;
}
}
}
Run Code Online (Sandbox Code Playgroud)