【问题标题】:Get Result of System.Threading.Tasks.Task (ApplicationUser MVC)获取 System.Threading.Tasks.Task 的结果(ApplicationUser MVC)
【发布时间】:2016-12-20 04:47:48
【问题描述】:

我只想在 MVC 中获取我的 ApplicationUser。我正在尝试这段代码:

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

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

但是,当我尝试访问 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."

不确定如何访问结果。

【问题讨论】:

    标签: multithreading asp.net-core asp.net-core-mvc


    【解决方案1】:

    根据您发布的代码(没有任何异常细节),我猜测问题在于_userManagernull

    但是,如果你解决了这个问题,你会遇到另一个问题。具体来说,您应该使用await 而不是Resultthe latter can cause deadlocks.

    【讨论】:

    • userManager 不为空,我给出了我得到的异常详细信息。如何使用 await 而不是 .Result?我试过 var user = await GetApplicationUser();但得到的错误是它不是异步的,即使它是异步的。谢谢。
    • @ClaySmith:您应该发布异常的堆栈跟踪 - 这至少会告诉您发生在哪里。您收到有关 async 的错误消息是因为 calling 方法不是异步的。换句话说,要使用await,您必须在async 方法内,因此您还需要将该方法更改为async
    【解决方案2】:

    确保你的控制器动作是异步任务,像这样:

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

    【讨论】:

      【解决方案3】:

      我必须手动调用 .Wait() 函数,然后才能成功访问 .Result。另外,我的 HttpContext 是空的,所以我不得不在 Index() 中使用它,比如

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

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

      【讨论】:

      • 不是一个很好的解决方案。您是否尝试过建议 public async Task Index()
      猜你喜欢
      • 2018-10-30
      • 2016-04-30
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多