2017-09-26 19 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 –