如何在C#中的三元运算符中使用await?

问题描述 投票:0回答:2

使用此代码,对

SoftUpdateAsync
UpdateAsync
的调用似乎没有等待,我收到了死锁事务的错误。

_ = await _tabRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? _tabRepository.SoftUpdateAsync(entity)
    : _tabRepository.UpdateAsync(entity);

函数

IsReferencedFromAnotherTableAsync
返回 bool,
UpdateAsync
SoftUpdateAsync
返回任务。

但是,如果我将代码写为

if (await _tabRepository.IsReferencedFromAnotherTableAsync(entity.Id))
    await _tabRepository.SoftUpdateAsync(entity);
else
    await _tabRepository.UpdateAsync(entity);

一切似乎都正常工作。

我可以使用三元运算符代替 if then else 吗?

我尝试过:

_ = await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? await _countdownRepository.SoftUpdateAsync(entity)
    : await _countdownRepository.UpdateAsync(entity);

await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? await _countdownRepository.SoftUpdateAsync(entity)
    : await _countdownRepository.UpdateAsync(entity);

两者都会导致错误。

c# async-await conditional-operator
2个回答
3
投票

我强烈怀疑你想要:

await (await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? _countdownRepository.SoftUpdateAsync(entity)
    : _countdownRepository.UpdateAsync(entity));

或者更清楚地了解发生了什么:

var task = await _tabRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? _tabRepository.SoftUpdateAsync(entity)
    : _tabRepository.UpdateAsync(entity);
await task;

我强烈怀疑问题在于

_tabRepository.SoftUpdateAsync(entity)
(和另一个分支)都只返回
Task
- 当您等待它时,不会返回任何内容。您不能使用条件 ?: 表达式,其中两个分支不返回任何内容。因此,您需要确定要等待哪个任务,然后等待它 - 这就是我上面的两个选项所做的。


0
投票

您需要确保三元的两个分支都包含在括号中以帮助编译器:

await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? (await _countdownRepository.SoftUpdateAsync(entity))
    : (await _countdownRepository.UpdateAsync(entity));

或者您可以使用返回的

Task
:

var updateTask = await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? _countdownRepository.SoftUpdateAsync(entity)
    : _countdownRepository.UpdateAsync(entity);

await updateTask;

可以简化为:

await (
await _countdownRepository.IsReferencedFromAnotherTableAsync(entity.Id)
    ? _countdownRepository.SoftUpdateAsync(entity)
    : _countdownRepository.UpdateAsync(entity)
);
© www.soinside.com 2019 - 2024. All rights reserved.