在C#中使用异步和任务

时间:2017-09-26 14:43:59

标签: c# asynchronous async-await

我正在尝试创建一个看起来像这样的方法

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);
    }

这个方法给我一个错误,因为我有等待TeamsGraph,它要求将方法标记为异步。如果我向方法添加async,那么表示Task.FromResults(0)的2行则会出错。我所覆盖的基础方法需要返回该特定类型。

我确定我遗漏了一些简单的东西,但我还没有完成Async Await,所以我正在寻找有关如何设置此方法的指导。

修改

让我们看看我是否可以覆盖下面的所有人的评论。

rmjoia - 如果我在Task前添加async,那么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 - 由于您是第一个提出建议的人,您可以提交答案,我会接受。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

你能做到这一点:

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