我正在使用带有dapper的MySQL客户端,并尝试使用ExecuteReaderAsync方法执行异步任务。有人告诉我不要将以下内容封装在using语句中,但是当我将任务更改为异步时(在此之前使用executereader,并且工作得很好),我总是收到nullreference异常。
我认为我正在陷入竞争状态,在异步任务完成之前,会在mysql客户端上调用Dispose()。 Dapper在SqlMapper对象/执行读取器异步功能上提供的异步任务。我怀疑这是因为在覆盖存储库中的IDisposable接口时,如何在调用存储库中的下一行(ct.read())之前调用dispose()函数。
我写的任务是:
public async Task<CodeTable> GetCodeTableById(int codeTableId)
{
DynamicParameters parameters = new DynamicParameters();
parameters.Add("codeTableId", codeTableId);
CodeTable codeTable = new CodeTable();
try
{
// TODO: convert to async
var ct = await SqlMapper.ExecuteReaderAsync(conn, "GetCodeTableByID", parameters, commandType: CommandType.StoredProcedure);
ct.Read();
int result;
if (int.TryParse(ct.GetValue(0).ToString(), out result))
{
codeTable.Id = result;
}
if (int.TryParse(ct.GetValue(1).ToString(), out result))
{
codeTable.IntegrationId = result;
}
codeTable.CodeTableName = ct.GetValue(2).ToString();
codeTable.IsActive = (bool)ct.GetValue(3);
// TODO: Add custom exception for error type
} catch (Exception ex)
{
throw ex;
}
return codeTable;
}
它在await命令的TODO语句正下方中断。我收到以下错误:An unhandled exception occurred while processing the request.
NullReferenceException: Object reference not set to an instance of an object.
在这里帮助我了解是否达到比赛条件。我不确定这是不是dotnet核心调用的处置不正确,还是Dapper的executereaderasync函数无法正确利用我的等待标志。
---编辑--- 该问题被错误地标记为与另一个问题重复。我相信我以为我不必调试dapper库就不会错了。