检查 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 值填充。由于这是一个异步调用,您无法确定在按照您在此处完成的方式接收任务时调用是否已完成。

主要有两种处理方法:

  1. 如果您在异步上下文中(使用 async 关键字的方法),您可以只使用 await-关键字等待并解包结果。 var type = await _landlordRepository.GetAll().AnyAsync(...);

  2. 如果您处于同步上下文中,则可以使用 Task.Wait() 等待调用,然后从 Task<T>.Result.[=14= 中读取结果值]

    var task = _landlordRepository.GetAll().AnyAsync(...).Wait(); var type = task.Result

正如人们指出的那样,通常不建议使用 .Result,因为它是一个阻塞调用。