2016-07-31 11 views
1

HandleRequirementAsyncメソッドをオーバーライドしていますので、そのメソッドの戻り値の型を変更できません。しかし、私は非同期であり、待たなければならないUserManagerのメソッドを呼び出していますので、このコードを別のメソッドに入れる必要がありました。どのように非同期メソッドを呼び出すと、C#で.Resultを使わずに非同期にすることはできません。

 protected override Task HandleRequirementAsync(
      AuthorizationHandlerContext context, 
      EducationArmRequirement requirement) 
     { 

      if (!IsEducationGroup(context).Result) 
      { 
       return Task.FromResult(0); 
      } 


      context.Succeed(requirement); 

      return Task.FromResult(0); 
     } 

     protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context) 
     { 
      var userId = context.User.Identity.Name; 
      ApplicationUser u = await _userManager.FindByNameAsync(userId); 
      if (u.Group == 3 || u.Group == 4) 
      { 
       return await Task.FromResult(true); 
      } 
      return await Task.FromResult(false); 
     } 

上記のコードはテストでは動作するようですが、.Resultを使用してboolを取得するためにタスクをアンラップします。私は結果を使用するのに注意すると言ういくつかの場所を見てきました。私はこれを見たquestion理由を説明しようとするが、私はそれを取得していない。

HandleRequirementAsyncメソッドには、このオーバーライドされたメソッドではできない戻り値の型を変更する必要があるため、これを正常に解除できるようにすることはできません。

私はこれを.Resultを使う上で正しい方法に近づけていますか、私はここでいくつかの問題に出くわしていますか?もしそうなら、これにアプローチする別の方法は何でしょうか?

どのようなヘルプ/説明も高く評価されます。

+2

だけタスクHandleRequirementAsync'非同期 '保護されたオーバーライドとしてメソッドを定義します。ここでは戻り値の型の変更はありません。また、 'await'を使用することもできます。 –

+0

' return await Task.FromResult(true);の必要もありません。 'return true; 'と一緒に行けばいいです。 –

+0

@AlekseyL。メモをありがとう。私はこれを最初に試みましたが、戻り値の型としてTaskについて苦情を申し立てました。このエラーを伴うタスクが欲しかった:'EducationArmHandler.HandleRequirementAsync(AuthorizationHandlerContext、EducationArmRequirement)'は 'Task'を返す非同期メソッドであるため、オブジェクト表現によって。 「仕事」を返すつもりでしたか? \tその後、タスクに変更すると、オーバーライドされたメソッドの型と一致しないため、その型のオーバーロードはありません。 – Xaxum

答えて

4

コメントで示唆したとおり、非同期修飾子は、メソッドのシグネチャを変更しない - あなたはこれを追加することができます。また、両方の方法でTask.FromResultの使用を削除するために簡略化することができます。

protected override async Task HandleRequirementAsync(
    AuthorizationHandlerContext context, 
    EducationArmRequirement requirement) 
{ 
    if (await IsEducationGroup(context)) 
    { 
     context.Succeed(requirement); 
    } 
} 

protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context) 
{ 
    var userId = context.User.Identity.Name; 

    ApplicationUser u = await _userManager.FindByNameAsync(userId); 

    return u.Group == 3 || u.Group == 4; 
} 
+0

です。私が見逃していた鍵はif文で待っていました。私はある時点でそれを試みましたが、明らかに私は別のところで問題を抱えていました。再度、感謝します。 – Xaxum

0

IsEducationGroupグループ機能

protected async Task<bool> IsEducationGroup(AuthorizationHandlerContext context) 
{ 
await Task.Run((){ 

      var userId = context.User.Identity.Name; 
      ApplicationUser u = await _userManager.FindByNameAsync(userId); 
      if (u.Group == 3 || u.Group == 4) 
      { 
       return true; 
      } 
      return false; 
     } 

    }) 

HandleRequirementAsync機能

protected override async Task HandleRequirementAsync(
      AuthorizationHandlerContext context, 
      EducationArmRequirement requirement) 
     { 

      var result = await (!IsEducationGroup(context)); 
      if(!result) 
       return; 


      context.Succeed(requirement); 
      return; 
     } 
関連する問題