4

不知道为什么在任务完成后这没有返回我的视图,我可以在谷歌上找到很多关于为什么。

public async Task<ActionResult> GetUserAsync()
    {

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

        await Task.WhenAll(value);

        return View("GetUser");
    }
4

4 回答 4

23

好的,所以经过太多小时的调试和拔掉我剩下的头发,我找到了罪魁祸首。这是我的 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);
    }
}
于 2013-07-24T05:55:15.053 回答
2

我遇到了同样的问题,我使用的是 .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 天时间试图自己找到答案

于 2013-11-07T19:17:56.993 回答
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的引用,该库是全局过滤器的遗留解决方案。

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

于 2014-05-22T21:56:36.230 回答
0

它返回一个任务,完成后包含计算结果。

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

于 2013-07-17T22:14:46.217 回答