[英]Check if Task<bool> is true or false (C#)
我有方法,可以检查 Landlords шт LandlordTypes 的数量
我有这个代码来检查它
var type = _landlordTypeRepository.GetAll()
.Include(x => x.Landlords)
.FirstOrDefault(x => x.Id == input.Id);
if (type.Landlords.Count > 0)
{
throw new UserFriendlyException(L("ThisTypeIsInUse"));
}
但我是这样改写的
var type = _landlordTypeRepository
.GetAll()
.AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
但是现在返回类型 id Task<bool>
我如何在 if 中使用它?
您需要使用await
:
var type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
您的方法还必须标记为async
。
我建议您熟悉async-await 。
使用await
来“解包” Task
结果
bool type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
还将调用方法标记为async
async Task SomeMethod() {
//..
bool type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
//..
}
您可以使用await
关键字或简单地将.Result
放在任务的末尾以获得您正在寻找的值。
使用await
,您的方法的签名必须具有 async 并且还必须返回一个Task
(例如Task<string>
或简单的Task
for void),除非它是一个可以是async void
的事件。
使用.Result
,将阻塞当前线程,这意味着也可以冻结 UI!
任务是用于异步调用的参考数据结构。 它包含一个 .Result 属性,一旦调用完成,它将用返回值填充。 由于它是一个异步调用,因此在以您在此处完成的方式接收任务时,您无法确定该调用是否已完成。
有两种主要的处理方法:
如果您在异步上下文中(使用 async 关键字的方法),您可以只使用await
关键字来等待并解包结果。 var type = await _landlordRepository.GetAll().AnyAsync(...);
如果您处于同步上下文中,则可以使用 Task.Wait() 等待调用,然后从Task<T>.Result
.Result 读取结果值。
var task = _landlordRepository.GetAll().AnyAsync(...).Wait(); var type = task.Result
正如人们所指出的,通常不建议使用 .Result ,因为它是一个阻塞调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.