为什么这会返回System.Threading.Tasks.Task`1 [System.Web.Mvc.ActionResult]

时间:2013-07-17 22:09:51

标签: asp.net-mvc-4

不确定为什么在任务完成后这不会返回我的视图,我可以在Google上找到很多原因。

public async Task<ActionResult> GetUserAsync()
    {

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

        await Task.WhenAll(value);

        return View("GetUser");
    }

4 个答案:

答案 0 :(得分:19)

好的,所以经过几个小时的调试和拉出我的头发后,我找到了罪魁祸首。这是我的WindsorActionInvoker !!从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);
    }
}

答案 1 :(得分:2)

此项目是否已从先前版本升级?检查您引用的任何库是否未将旧版本的MVC引用为依赖项。为了解决这个问题,我......

从我的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>

确保targetFramework是.NET 4.5

<compilation debug="true" targetFramework="4.5">

删除了对库Fluent Filters的引用,这是全局过滤器的传统解决方案。

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

答案 2 :(得分:1)

我遇到了同样的问题,我使用的是.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" />

按照抛出的错误中的指示修改后,在Web.config中

<add key="webpages:Version" value="1.0.0.0" />

一切都开始正常工作。

我希望这有助于某人,我花了3天时间试图找到答案

答案 3 :(得分:0)

它返回一个Task,当完成时,它包含计算结果。

这是C#的语法糖,在你习惯它之前它可能看起来很奇怪。如果您只想抓取结果而不进行异步(阻止调用),则可以编写var r = await GetUserAsync();r的类型为ActionResult