2013-07-17 86 views
1

不知道为什么在任务完成后这并没有返回我的视图,我可以在Google上找到很多原因。为什么这会返回System.Threading.Tasks.Task`1 [System.Web.Mvc.ActionResult]

public async Task<ActionResult> GetUserAsync() 
    { 

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

     await Task.WhenAll(value); 

     return View("GetUser"); 
    } 
+0

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx – Lee

+0

确保您的目标是.NET 4.5,而不是.NET 4.0。 –

+0

回答

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参考这是全球过滤器的传统解决方案。

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

0

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

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

+0

该方法甚至没有执行,这是一个更大的问题 – DfwForSale

+0

然后,你应该提供更多的代码或告诉更多关于错误... –

+0

从所调用的方法粘贴所有的代码将有点毫无意义,考虑到它的事实从来没有执行过。 – DfwForSale

18

好的,经过了很多小时的调试和拔掉我的头发后,我发现了罪魁祸首。这是我的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); 
    } 
} 
+4

你是救命恩人! –

+0

优秀的捕获这一个。谢谢! –

+0

我有异步和非异步操作的混合,除了InvokeActionMethodWithFilters之外,最终不得不重写BeginInvokeActionMethodWithFilters以使注入跨所有操作 – Josh

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" /> 

一切开始TOR正常工作。

我希望这可以帮助别人,我花了3天尝试寻找答案自己