我有方法检查地主的数量шт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>
如果要怎么用呢?
答案 0 :(得分:5)
您需要使用await
:
var type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
您的方法还必须标记为async
。
我建议您熟悉async - await。
答案 1 :(得分:2)
使用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());
//..
}
答案 2 :(得分:0)
您可以使用await
关键字,也可以简单地将.Result
放在任务的末尾以获取所需的值。
使用await
时,方法的签名必须具有异步性,并且还必须返回Task
(例如Task<string>
或简单地Task
表示无效),除非它是可以然后成为async void
。
使用.Result
将阻塞当前线程,这意味着也可以冻结UI!
答案 3 :(得分:0)
任务是用于异步调用的参考数据结构。它包含一个.Result-property,一旦调用完成,它将用返回值填充。由于它是一个异步调用,因此您无法以此处的方式肯定知道在接收任务时该调用已完成。
有两种主要的处理方法:
如果您位于异步上下文中(使用async关键字的方法),则可以仅使用await
关键字来等待并解包结果。
var type = await _landlordRepository.GetAll().AnyAsync(...);
如果您处于同步上下文中,则可以使用Task.Wait()等待调用,然后从Task<T>.Result
中读取结果值。
var task = _landlordRepository.GetAll().AnyAsync(...).Wait();
var type = task.Result
正如人们指出的那样,通常不建议使用.Result,因为它是阻塞调用。