检查 Task<bool> 是真还是假 (C#)
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());
但现在 return 输入 id Task<bool>
如何在 if 中使用它?
您可以使用 await
关键字或简单地将 .Result
放在任务的末尾以获得您要查找的值。
当使用 await
时,您的方法的签名必须具有异步并且还必须 return 一个 Task
(例如 Task<string>
或简单地 Task
表示无效)除非它是一个可以 async void
的事件。
使用 .Result
,将阻塞当前线程,这意味着也可以冻结 UI!
您需要使用 await
:
var type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
您的方法也必须标记为 async
。
我建议您熟悉 async - await。
使用await
得到"unwrap"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());
//..
}
Task是用于异步调用的引用数据结构。它包含一个 .Result-属性 ,一旦调用完成,它将用 return 值填充。由于这是一个异步调用,您无法确定在按照您在此处完成的方式接收任务时调用是否已完成。
主要有两种处理方法:
如果您在异步上下文中(使用 async 关键字的方法),您可以只使用 await
-关键字等待并解包结果。
var type = await _landlordRepository.GetAll().AnyAsync(...);
如果您处于同步上下文中,则可以使用 Task.Wait() 等待调用,然后从 Task<T>.Result
.[=14= 中读取结果值]
var task = _landlordRepository.GetAll().AnyAsync(...).Wait();
var type = task.Result
正如人们指出的那样,通常不建议使用 .Result,因为它是一个阻塞调用。
我有方法来检查 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());
但现在 return 输入 id Task<bool>
如何在 if 中使用它?
您可以使用 await
关键字或简单地将 .Result
放在任务的末尾以获得您要查找的值。
当使用 await
时,您的方法的签名必须具有异步并且还必须 return 一个 Task
(例如 Task<string>
或简单地 Task
表示无效)除非它是一个可以 async void
的事件。
使用 .Result
,将阻塞当前线程,这意味着也可以冻结 UI!
您需要使用 await
:
var type = await _landlordTypeRepository.GetAll().AnyAsync(x=> x.Id == input.Id && x.Landlords.Any());
您的方法也必须标记为 async
。
我建议您熟悉 async - await。
使用await
得到"unwrap"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());
//..
}
Task是用于异步调用的引用数据结构。它包含一个 .Result-属性 ,一旦调用完成,它将用 return 值填充。由于这是一个异步调用,您无法确定在按照您在此处完成的方式接收任务时调用是否已完成。
主要有两种处理方法:
如果您在异步上下文中(使用 async 关键字的方法),您可以只使用
await
-关键字等待并解包结果。var type = await _landlordRepository.GetAll().AnyAsync(...);
如果您处于同步上下文中,则可以使用 Task.Wait() 等待调用,然后从
Task<T>.Result
.[=14= 中读取结果值]var task = _landlordRepository.GetAll().AnyAsync(...).Wait(); var type = task.Result
正如人们指出的那样,通常不建议使用 .Result,因为它是一个阻塞调用。