使用此代码,对
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);
两者都会导致错误。
我强烈怀疑你想要:
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
- 当您等待它时,不会返回任何内容。您不能使用条件 ?: 表达式,其中两个分支不返回任何内容。因此,您需要确定要等待哪个任务,然后等待它 - 这就是我上面的两个选项所做的。
您需要确保三元的两个分支都包含在括号中以帮助编译器:
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)
);