2017-09-26 13 views
-3

使用異步和任務,我試圖創建一個看起來像這樣在C#

protected override Task 
     HandleRequirementAsync(AuthorizationHandlerContext context, 
      OperationAuthorizationRequirement requirement, 
      string resource) 
    { 
     if (context.User == null || resource == null) 
     { 
      return Task.FromResult(0); 
     } 

     var members = await TeamsGraph.GetTeamMembers(resource, context.User); 

     return Task.FromResult(0); 
    } 

這種方法給我一個錯誤,因爲我有AWAIT TeamsGraph,這就要求標記爲異步方法的方法。如果我向該方法添加異步,則表示Task.FromResults(0)的兩行將出錯。該特定類型的返回是由我重寫的底層方法所要求的。

我確定我錯過了一些簡單的東西,但我只是沒有完成異步等待,所以我正在尋找如何設置此方法的指導。

編輯

讓我們來看看,如果我可以在下面覆蓋大家的意見。

rmjoia - 如果我在任務前添加異步,則返回2的Task.FromResult(0)行出錯。

Bradley Uffner - 我正在做的代碼來自ASP.NET Core的授權示例,它是預期返回的內容。一個例子見https://docs.microsoft.com/en-us/aspnet/core/security/authorization/secure-data

David - 在await線後面的代碼中有更多的代碼來檢查用戶是否是TeamMember,我只是爲了簡單而省略。

JSteward - 由於您是第一個提出這個問題的人,您可以提交答案,我會接受。

+4

附加異步,大功告成,是因爲@JSteward說,去掉Task.FromResult(0); – rmjoia

+3

當一個方法被標記爲'async'並且只返回'Task'而不需要'return'語句時,標記'async'方法並簡單地移除'Task.FromResult'。 – JSteward

+2

你回來什麼類型的價值?你的方法被聲明爲'Task',它不返回任何值,但你使用'Task.FromResult(0)'嘗試返回'0'。如果你需要返回一個'int',它應該是'Task '。你需要選擇一個或另一個。 –

回答

0

您應該返回Task<int>不僅僅是Task

protected override async Task<int> HandleRequirementAsync(
     AuthorizationHandlerContext context, 
     OperationAuthorizationRequirement requirement, 
     string resource) 
{ 
    if (context.User == null || resource == null) 
    { 
     return 0; 
    } 

    var members = await TeamsGraph.GetTeamMembersAsync(resource, context.User); 

    return 0; 
} 
+0

不,因爲我重寫了一個不可能的方法 –

+0

然後你不能返回async 0或Task.FromResult(0),這相當於試圖在void方法中返回0。 –

0

你能做到這一點:任務之前

var members = TeamsGraph.GetTeamMembers(resource, context.User); 
    members.Wait(); 
+0

正確答案來自jsteward –