C# 将asyc方法合并到一个任务中

C# 将asyc方法合并到一个任务中,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,不确定这是否可行,或者它是否已经在内部对链式任务进行了更简单的操作,无法从我阅读的信息中得出结论 public async Task<ClaimsIdentity> CreateIdentity(string userid ) { Guid gid = Guid.Parse(userid); Avatar avatar = await _dbContext.Users.Where(d => d.Id == gid).FirstOrDefaultAsync();

不确定这是否可行,或者它是否已经在内部对链式任务进行了更简单的操作,无法从我阅读的信息中得出结论

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异步任务CreateIdentity(字符串userid)
{
Guid gid=Guid.Parse(userid);
Avatar Avatar=await _dbContext.Users.Where(d=>d.Id==gid.FirstOrDefaultAsync();
返回等待CreateIdentity(化身);
}
公共异步任务CreateIdentity(化身)
{
var identity=新的索赔实体(等待获得索赔(化身));
返回身份;
}  
公共异步任务GetClaims(化身)
{ 
var索赔=新列表();
claims=async/(获取索赔的数据库调用)
退货索赔;
} 
对于上面的代码或任何其他类似的异步代码,我想知道是否有任何方法可以说,继续,或者继续。因此,不是以三个任务结束,而是可以将它们组合在一起,这样就有了一个单一的状态机——两种方法,甚至是所有三种方法

我不确定这是否有那么重要,只是在寻找正确的方法

(我知道不是有效代码)

public异步任务CreateIdentity(字符串userid)
{
Guid gid=Guid.Parse(userid);
Avatar Avatar=await _dbContext.Users.Where(d=>d.Id==gid.FirstOrDefaultAsync();
返回contiuneinto CreateIdentity(化身);
}

^说这样的话。所以下一个方法将在同一个任务中。为这么少的东西创造另一个任务似乎是如此浪费

每个
async
方法都有自己的状态机和任务,不能自动组合它们

您可以同时删除
async
wait
并使用
任务。继续使用
删除状态机,但仍会创建新任务:

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()));
}

无论如何,你不必担心。创建该任务的成本可能与实际的异步操作相比是可以忽略的。

avatarsk.GetAwaiter().GetResult()
为什么不
等待avatarsk
呢?@YuvalItzchakov在
ContinueWith
中,在
ContinueWith
@YuvalItzchakov内,因为lambda需要是
异步的
,而
ContinueWith
不支持,将返回
任务,因此需要添加
展开
。你可以这样做,但当任务已经完成时,这是多余的…@YuvalItzchakov,这也会创建我们想要避免的状态机。即使没有分配。
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()));
}
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);
}