Asp.net mvc 4 为什么返回System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]

Asp.net mvc 4 为什么返回System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult],asp.net-mvc-4,Asp.net Mvc 4,我不知道为什么在任务完成后这不会返回我的视图,我可以在谷歌上找到很多关于原因的信息 public async Task<ActionResult> GetUserAsync() { var value = Task.Factory.StartNew(() => _userService.GetUser("ausername")); await Task.WhenAll(value); return View("Get

我不知道为什么在任务完成后这不会返回我的视图,我可以在谷歌上找到很多关于原因的信息

public async Task<ActionResult> GetUserAsync()
    {

        var value = Task.Factory.StartNew(() => _userService.GetUser("ausername"));

        await Task.WhenAll(value);

        return View("GetUser");
    }
公共异步任务GetUserAsync() { var值=Task.Factory.StartNew(()=>\u userService.GetUser(“ausername”); 等待任务。WhenAll(值); 返回视图(“GetUser”); }
它返回一个任务,任务完成后包含计算结果


这是C#的语法糖,在你习惯它之前,它可能看起来很奇怪。如果只想在不进行异步的情况下获取结果(执行阻塞调用),可以编写
var r=await GetUserAsync()
r
将是
ActionResult

好的,所以经过了太多小时的调试,我找到了罪魁祸首。这是我的WindStorActionInvoker!!从ControllerActionInvoker到AsyncControllerActionInvoker的更改修复了异步任务无法正常工作的问题

我希望这对某人有帮助

public class WindsorActionInvoker : AsyncControllerActionInvoker
{
    private readonly IKernel _kernel;


    public WindsorActionInvoker(IKernel kernel)
    {
        _kernel = kernel;
    }

    protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext,
                                                                           IList<IActionFilter> filters,
                                                                           ActionDescriptor actionDescriptor,
                                                                           IDictionary<string, object> parameters)
    {
        foreach (IActionFilter actionFilter in filters)
        {
            _kernel.InjectProperties(actionFilter);
        }
        return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters);
    }
}
公共类WindStorActionInvoker:AsyncControllerActionInvoker
{
私有只读IKernel_内核;
公共WindStoractionInvoker(IKernel内核)
{
_内核=内核;
}
受保护的覆盖操作ExecuteContext InvokeActionMethodWithFilters(ControllerContext ControllerContext,
IList过滤器,
ActionDescriptor ActionDescriptor,
(字典参数)
{
foreach(过滤器中的IActionFilter actionFilter)
{
_注入属性(actionFilter);
}
返回base.InvokeActionMethodWithFilters(controllerContext、filters、actionDescriptor、parameters);
}
}

我遇到了完全相同的问题,我使用的是.NET framework 4.5,但MVC 3,显然MVC 3不支持.NET 4.5,这是导致错误的原因,升级到MVC 4后,我能够修复错误。我在NuGet中发现了一个名为Upgrade MVC 3 To MVC 4的包,它为升级创造了奇迹,但我在后记中发现了一个错误。后来的问题是线路

<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="webpages:Version" value="2.0.0.0" />  <-------- This line
<add key="PreserveLoginUrl" value="true" />


此项目是否从以前的版本升级?检查您正在引用的库是否没有作为依赖项引用旧版本的MVC。为了解决这个问题,我

已从my web.config中删除以下内容:

  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

这是全局过滤器的传统解决方案


通过这些更改,我能够从控制器返回任务。

确保您的目标是.NET 4.5,而不是.NET 4.0。我在尝试返回此类型但使用mvc3时遇到此错误。更新到mvc4修复了该问题。该方法甚至不执行,这是一个更大的问题。考虑到该方法从未执行过的事实,从被调用的方法中列出所有代码将有点毫无意义。@user2593320问题是,您不清楚要执行什么代码,如何调用该方法,是否有异常被抛出,是否有编译器警告,等等。我想没有人喜欢猜测。将此标记为答案,因为它让我思考。这一点非常好。谢谢我混合了异步和非异步操作,最终不得不用过滤器覆盖BeginInvokeActionMethodWithFilters,还要调用EactionMethodWithFilters才能让注入在所有操作中工作。8年前,你的帖子帮助了我!复活节星期天晚上10:30,我坐在这里,黑客入侵一个10年前我为一个客户建立的旧系统,试图让它从目前所有的旧技术用户那里升级。我我一点一点地到了那里,这篇文章对我有帮助!:-)
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>
<compilation debug="true" targetFramework="4.5">