不确定这是否可行,或者它是否已经在内部使用链式任务做了更简单的事情,无法从我读过的信息中解决这个问题。
public async Task<ClaimsIdentity> CreateIdentity(string userid )
{
Guid gid = Guid.Parse(userid);
Avatar avatar = await _dbContext.Users.Where(d => d.Id == gid).FirstOrDefaultAsync();
return await CreateIdentity(avatar);
}
public async Task<ClaimsIdentity> CreateIdentity(Avatar avatar)
{
var identity = new ClaimsIdentity(await GetClaims(avatar));
return identity;
}
public async Task<List<Claim>> GetClaims(Avatar avatar)
{
var claims = new List<Claim>();
claims = async //(database call to get claims)
return claims;
}
使用上面的代码或任何其他类似的异步代码,我想知道有什么方法可以说,继续进入或继续。那么,它们可以组合起来,而不是最终完成三个任务,因此有一个状态机可以是两个方法,也可以是全部三个?
我不确定这是否重要,只是寻找正确的方法。
例如。 (我知道的代码不是有效的)
public async Task<ClaimsIdentity> CreateIdentity(string userid )
{
Guid gid = Guid.Parse(userid);
Avatar avatar = await _dbContext.Users.Where(d => d.Id == gid).FirstOrDefaultAsync();
return contiuneinto CreateIdentity(avatar);
}
^说出类似的话。所以下一个方法将是同一个任务。似乎是浪费,为这么少的事情创造了另一项任务。
答案 0 :(得分:2)
每个async
方法都有自己的状态机和任务,您无法自动组合它们。
您可以删除await
和Task.ContinueWith
并使用删除状态机的public Task<ClaimsIdentity> CreateIdentity(string userid )
{
Guid gid = Guid.Parse(userid);
return _dbContext.Users.Where(d => d.Id == gid).FirstOrDefaultAsync().
ContinueWith(avatarTask => CreateIdentity(avatarTask.GetAwaiter().GetResult()));
}
,但它仍会创建新任务:
async
减少这些任务和状态机的最简单方法是简单地将这些public async Task<ClaimsIdentity> CreateIdentity(string userid )
{
Guid gid = Guid.Parse(userid);
Avatar avatar = await _dbContext.Users.Where(d => d.Id == gid).FirstOrDefaultAsync();
var claims = new List<Claim>();
claims = async //(database call to get claims)
return new ClaimsIdentity(claims);
}
方法连接在一起,例如:
FtpWebRequest
无论如何,您无需担心。创建任务的成本可能无法与您的实际异步操作相结合。