繁体   English   中英

检查是否有任务<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());

但是现在返回类型 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 属性,一旦调用完成,它将用返回值填充。 由于它是一个异步调用,因此在以您在此处完成的方式接收任务时,您无法确定该调用是否已完成。

有两种主要的处理方法:

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

  2. 如果您处于同步上下文中,则可以使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM