簡體   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