2013-07-17 143 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天嘗試尋找答案自己

相關問題