מלך*_*שיח 1 c# linq backend async-await
我有一个看起来像这样的函数:
Task<IEnumerable<User>> GetUserContactInfo(
CancellationToken cancellationToken = new CancellationToken()
)
{
var users = from u in _userDbContext.Users
join ur in _userDbContext.UserRoles on u.Id equals ur.UserId
select u;
var u2 = users.ToListAsync(cancellationToken).ConfigureAwait(false);
return u2;
}
Run Code Online (Sandbox Code Playgroud)
但是..试图编译它给了我这个错误:
错误 CS0029 无法将类型隐式转换
'System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.Collections.Generic.List <IPD.Identity.Domain.Aggregates.UserAggregate.User>>'
为'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<IPD.Identity.Domain.Aggregates.UserAggregate.User>>'
关于如何转换为函数的返回类型的任何想法,或者将某些东西附加到 linq 以返回正确的类型,或者真的有任何其他想法?
ConfigureAwait
返回ConfiguredTaskAwaitable
,不是Task
。您需要使用await
关键字显式地等待该方法,并将该方法更改为async
.
但是,您也可以直接返回,在这种情况下,除了添加到调用方法之外,Task
无需执行ConfigureAwait(false)
任何操作ConfigureAwait()
。
因此,只需users.ToListAsync(cancellationToken);
从该方法返回并调用它:
var info = await GetUserContactInfo(token).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于您没有await
在该方法内部使用,因此不需要ConfigureAwait
after ToListAsync()
。
更新评论:
顺便说一句,由于函数的返回类型是Task<IEnumerable<...>
,您将无法返回Task<List<...>>
。因为,Task<>
不是协变类型。为了解决该问题,您可以将返回类型更改为Task<List<...>>
.
所以结果可能是这样:
Task<List<User>> GetUserContactInfo(CancellationToken cancellationToken = new CancellationToken())
{
var users = from u in _userDbContext.Users
join ur in _userDbContext.UserRoles on u.Id equals ur.UserId
select u;
return users.ToListAsync(cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
552 次 |
最近记录: |