异步方法没有可用的扩展方法,但生成的变量确实有



我正在使用带有c#和异步方法的MongoDB在标准存储库类中创建一些方法,我偶然发现了一些奇怪的行为。

最后,这可能一点也不奇怪,问题在于我自己对异步编程的经验不足。

请考虑以下代码:

public async Task<T> GetItem<T>(ObjectId id) where T : BaseItemEntity
{
var col = GetTypedCollection<T>();
var model = await col.FindAsync(x => x.Id == id);
return await model.FirstOrDefaultAsync();
}

现在这完全没问题,没有编译错误,但我实际上不确定它的正确调用等待 2 次。

现在考虑以下代码:

public async Task<T> GetItem<T>(ObjectId id) where T : BaseItemEntity
{
var col = GetTypedCollection<T>();
var model = await col.FindAsync(x => x.Id == id).FirstOrDefaultAsync();
return model;
}

根据编译器的说法,这是非法的。它抱怨FirstOrDefaultAsync((不是一个可用的调用方法。我得打电话.首先获得访问 的结果。FirstOrDefaultAsync((。

这是怎么回事?

var model = await col.FindAsync(x => x.Id == id).FirstOrDefaultAsync();

应该是:

var model = await (await col.FindAsync(x => x.Id == id)).FirstOrDefaultAsync();

这是因为 FindAsync 返回一个 Task 对象,而 FirstOrDefaultAsync 不适用于该对象。等待操作会产生实际结果。

这是 async/await IMO 最烦人的事情之一,因为它需要括号或变量来保存等待的结果以进行进一步处理。

我认为它实际上应该是

var model = await (await col.FindAsync(x => x.Id == id)).FirstOrDefaultAsync();

两个异步方法都返回一个任务对象,并且任务没有FirstOrDefault((方法(这就是为什么在((中需要await的原因(。另一个是必需的,因为这种方式模型是你的对象而不是任务。

相关内容

最新更新