2015-12-28 115 views
0

返回布爾我必須使用方法async和返回爲Task<bool>。但在await關鍵字我越來越不能等待字符串在編譯時本身的錯誤。我試圖從方法中返回布爾,但徒勞。這裏是我的方法..從異步方法

public async Task<bool> searchName(string Name) 
{ 
    Group retrievedGroup = new Group(); 
    string foundGroup = null; 
    try 
    { 
     foundGroup = await Client().Groups 
       .Where(group => group.DisplayName.Equals(Name)) 
       .ExecuteAsync().Result.ToString(); 

     if (foundGroup == "Some Name") 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch(){ } 
} 

回答

6

問題只是運營商的優先事項。 使用括號。你應該刪除Result也。

foundGroup = (await Client().Groups 
       .Where(group => group.DisplayName.Equals(Name)) 
       .ExecuteAsync()).ToString(); 

點(.)具有更高的優先級比等待,所以當你有

foundGroup = await Client().Groups 
     .Where(group => group.DisplayName.Equals(Name)) 
     .ExecuteAsync().Result.ToString(); 

它會等待爲ToString();。還要注意的是,你有

ExecuteAsync().Result.ToString(); 

訪問任務的Result導致程序執行,你失去你想實現所有異步條件。

+0

我需要等到所有完成。 – Lara

+0

你是什麼意思,直到所有完成? – dotctor

4

不要使用Task.Result與異步的await因爲它只會同步你的方法調用阻塞。相反,只需await

public async Task<bool> SearchNameAsync(string Name) 
{ 
    Group retrievedGroup = new Group(); 

    List<string> foundGroup = await Client().Groups 
           .Where(group => group.DisplayName.Equals(Name)) 
           .ExecuteAsync(); 


    return foundGroup.Contains("Some Name", StringComparer.OrdinalIgnoreCase); 
} 

旁註:

  1. 使用 「異步」 後綴上的異步方法。
  2. 請遵循.NET命名約定,這是PascalCase的方法。
  3. 不要使用空catch塊,它們會讓你的生活困難時,你嘗試調試代碼,不明白爲什麼這個方法返回false而不是拋出。或者至少記錄一些東西。
  4. 我使用string.Equals而不是==,因爲您可能想要提供StringComparison選項,例如,如果您要執行不區分大小寫的搜索。
+0

我需要返回一個bool ..不是一個字符串 – Lara

+2

爲什麼你認爲這個方法返回一個'string'? –

+0

我仍然在等待調用方法時不能等待字符串.. – Lara