C# 如何最好地避免可能的多个枚举,同时保持异步?
考虑以下方法:C# 如何最好地避免可能的多个枚举,同时保持异步?,c#,asynchronous,.net-core,C#,Asynchronous,.net Core,考虑以下方法: public async Task<IEnumerable<TORTDTransmissionOwner>> ReturnActiveTransmissionOwnersForUser(User inputUser) { _logger.LogDebug("ReturnActiveTransmissionOwnersForUser executing with user: {0}", inputUser.Email); IEnumerabl
public async Task<IEnumerable<TORTDTransmissionOwner>> ReturnActiveTransmissionOwnersForUser(User inputUser)
{
_logger.LogDebug("ReturnActiveTransmissionOwnersForUser executing with user: {0}", inputUser.Email);
IEnumerable<TORTDTransmissionOwner> transmissionOwners;
if (inputUser.IsAdmin || inputUser.IsApprover)
{
transmissionOwners = await _toStakeholderUploadDataService.GetTORTDTransmissionOwners();
_logger.LogDebug("User isAdmin or isApprover, count of TOs: {0}", transmissionOwners.Count());
}
else
{
transmissionOwners = inputUser.TransmissionOwners.Where(to => to.IsImplemented)
.OrderBy(to => to.TORTDTransmissionOwner.Dbaname).Select(to => to.TORTDTransmissionOwner);
_logger.LogDebug("User is standard, count of TOs: {0}", transmissionOwners.Count());
}
return transmissionOwners;
}
public异步任务ReturnActiveTransmissionOwnersForUser(用户输入用户)
{
_LogDebug(“ReturnActiveTransmissionOwnersForUser与用户执行:{0}”,inputUser.Email);
i数不清的输电业主;
if(inputUser.IsAdmin | | inputUser.IsApprover)
{
transmissionOwners=等待_ToTakeHolderUploAddataService.GetTortDTTransmissionOwners();
_LogDebug(“用户isAdmin或isApprover,TOs计数:{0}”,transmissionOwners.count());
}
其他的
{
transmissionOwners=inputUser.transmissionOwners.Where(to=>to.IsImplemented)
.OrderBy(to=>to.TORTDTransmissionOwner.dbName)。选择(to=>to.TORTDTransmissionOwner);
_LogDebug(“用户是标准的,TOs的计数:{0}”,transmissionOwners.count());
}
返回传输所有者;
}
目前,ReSharper向我发出警告,我将导致数据库调用的结果的多次枚举
但是,如果我将数据库调用更改为:
public Task<IEnumerable<TORTDTransmissionOwner>> ReturnActiveTransmissionOwnersForUser(User inputUser)
{
_logger.LogDebug("ReturnActiveTransmissionOwnersForUser executing with user: {0}", inputUser.Email);
IEnumerable<TORTDTransmissionOwner> transmissionOwners;
if (inputUser.IsAdmin || inputUser.IsApprover)
{
transmissionOwners = _toStakeholderUploadDataService.GetTORTDTransmissionOwners().Result.ToList();
_logger.LogDebug("User isAdmin or isApprover, count of TOs: {0}", transmissionOwners.Count());
}
else
{
transmissionOwners = inputUser.TransmissionOwners.Where(to => to.IsImplemented)
.OrderBy(to => to.TORTDTransmissionOwner.Dbaname).Select(to => to.TORTDTransmissionOwner).ToList();
_logger.LogDebug("User is standard, count of TOs: {0}", transmissionOwners.Count());
}
return transmissionOwners;
}
public Task ReturnActiveTransmissionOwnersForUser(用户输入用户)
{
_LogDebug(“ReturnActiveTransmissionOwnersForUser与用户执行:{0}”,inputUser.Email);
i数不清的输电业主;
if(inputUser.IsAdmin | | inputUser.IsApprover)
{
transmissionOwners=\u ToTakeHolderUploAddataService.GetTortDTTransmissionOwners().Result.ToList();
_LogDebug(“用户isAdmin或isApprover,TOs计数:{0}”,transmissionOwners.count());
}
其他的
{
transmissionOwners=inputUser.transmissionOwners.Where(to=>to.IsImplemented)
.OrderBy(to=>to.TORTDTransmissionOwner.dbName).Select(to=>to.TORTDTransmissionOwner.ToList();
_LogDebug(“用户是标准的,TOs的计数:{0}”,transmissionOwners.count());
}
返回传输所有者;
}
我已经不再需要异步,并且强制每个数据库调用都是同步的。当我不使用调试日志时,我宁愿使用异步,对吗
所以我的问题是,我如何在这里选择正确的方法?或者有没有更好的方法来编写此方法,以便在需要时可以同时使用async和debug语句?您也可以在async调用返回后具体化:
transmissionOwners =
(await _toStakeholderUploadDataService.GetTORTDTransmissionOwners()).ToList();
一般来说,@Xiaoy312的答案是正确的,但这取决于您在
GetTORTDTransmissionOwners()
中拥有什么,它会返回什么?它是否在内部具体化?不要忘了ConfigureAwait(false)
。您可以就ConfigureAwait进行讨论或提出一些其他答案吗?使用ToListAsync()
保持异步方法。@ZorgoZ,对于dotnet核心应用程序,您不需要ConfigureAwait
。但是,如果您计划将库与其他.NET框架一起使用,则最好使用。