[英]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 屬性,一旦調用完成,它將用返回值填充。 由於它是一個異步調用,因此在以您在此處完成的方式接收任務時,您無法確定該調用是否已完成。
有兩種主要的處理方法:
如果您在異步上下文中(使用 async 關鍵字的方法),您可以只使用await
關鍵字來等待並解包結果。 var type = await _landlordRepository.GetAll().AnyAsync(...);
如果您處於同步上下文中,則可以使用 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.