2016-12-19 2 views
0

私はMVCで私のApplicationUserを取得したいです。私はこのコードをしようとしている:System.Threading.Tasks.Task(ApplicationUser MVC)の結果を取得

public async System.Threading.Tasks.Task<ApplicationUser> GetApplicationUser() 
    { 
     return await _userManager.GetUserAsync(HttpContext.User); 
    } 

    var user = GetApplicationUser(); 
    var user2 = user.Result; 

しかし、私は例外

"One or more errors occurred. (Object reference not set to an instance of an object.)" 
"Object reference not set to an instance of an object." 

ない結果にアクセスする方法がわから取得user.Resultアクセスしようとします。

答えて

0

あなたが(任意の例外の詳細なし)掲載のコードから、私は問題は_userManagernullであるということであることをを推測します。

しかし、それを修正すれば別の問題が発生します。具体的には、Resultの代わりにawaitを使用する必要があります。 the latter can cause deadlocks。私は手動で.WAIT()関数を呼び出す必要があった

public async Task<IActionResult> Test() 
    {    
     ApplicationUser user = await GetCurrentUserAsync(); 
     if (user != null) { 
      // do more stuff here 
     } 
     // do more stuff here 
     return View();    
    } 

    private Task<ApplicationUser> GetCurrentUserAsync() 
    { 
     return _userManager.GetUserAsync(HttpContext.User); 
    } 
+0

のUserManagerのようなインデックス()の内部で、それを使用していたヌルだった、と私は私が得た例外の詳細を与えました。 .Resultの代わりにawaitを使用するにはどうすればよいですか?私はvarユーザー= GetApplicationUser()を待ってみました。たとえそれが非同期ではないというエラーを得ることができます。ありがとう。 –

+0

@ClaySmith:例外のスタックトレースを投稿する必要があります - 少なくとも*どこで*起こっているかを教えてください。 'async'に関するエラーメッセージは、*呼び出し*メソッドが非同期ではないためです。言い換えれば、 'await'を使うには' async'メソッドの中にいなければならないので、そのメソッドを 'async'に変更する必要があります。 –

0

あなたがそうのように、アクションがayncタスクのコントローラを確認してください。また、私のHttpContextはので、私がnullでない

public IActionResult Index() 
    { 
     DoSomethingWith(HttpContext); 
     return View(); 
    } 

  System.Threading.Tasks.Task<ApplicationUser> user = GetApplicationUser(context); 
      user.Wait(); 
      var user2 = user.Result; 
-2

、その後、私は正常に.Resultにアクセスすることができます。

+0

かなりの解決策ではありません。代わりにpublic asyncタスクを提案しようとしましたか? Index() – Ross