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框架一起使用,则最好使用。