将asyc方法合并为一个任务

时间:2015-06-07 16:42:52

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

^说出类似的话。所以下一个方法将是同一个任务。似乎是浪费,为这么少的事情创造了另一项任务。

1 个答案:

答案 0 :(得分:2)

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

您可以删除awaitTask.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

无论如何,您无需担心。创建任务的成本可能无法与您的实际异步操作相结合。