检查Task <bool>是true还是false(C#)

时间:2019-03-26 12:33:00

标签: c# task-parallel-library

我有方法检查地主的数量шт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>

如果要怎么用呢?

4 个答案:

答案 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,一旦调用完成,它将用返回值填充。由于它是一个异步调用,因此您无法以此处的方式肯定知道在接收任务时该调用已完成。

有两种主要的处理方法:

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

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

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

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