2014-03-12 30 views
-2

不能弄明白: 有這個(我已經刪除了大部分代碼,以方便閱讀)MVC TempData的不異步方法保存

[HttpPost] 
    public ActionResult Upload(HttpPostedFileBase file) 
    { 

     Change(); 

     return RedirectToAction("Index");    
    } 

public ActionResult Index() 
    { 

     return View(); 
    } 
private async void Change() 
    { 
     await Task.Run(() => 
      {      
       try 
       {      
        TempData["Text"] = "Text 1"; 

       } 
       catch 
       { 
        TempData["Text"] = "Text 2"; 
       } 

      }); 

查看 @TempData [「文本」]

我需要改變它,但它不會改變。需要一些幫助或其他方式來做到這一點(我只需要根據「更改」func中的條件來改變文本,並將其顯示給用戶)。 謝謝!

+0

一個完整的教程? –

回答

0

async void表示方法是fire-and-forget。控制器不會等待它完成,所以當您嘗試設置TempData時,響應已經被髮送回客戶端。

假設你正在使用ASP.NET MVC 4或更高版本,你將不得不的Change簽名更改爲async Task,使您的操作異步:

[HttpPost] 
public async Task<ActionResult> UploadAsync(HttpPostedFileBase file) 
{ 

    await Change(); 

    return RedirectToAction("Index");    
} 

private async Task Change() 
{ 
    await Task.Run(() => 
     {      
      try 
      {      
       TempData["Text"] = "Text 1"; 

      } 
      catch 
      { 
       TempData["Text"] = "Text 2"; 
      } 
     }); 
} 

事實上,沒有理由使用async/await在如果它只是簡單地調用Task.Run,​​則爲Change。你可以寫:

private Task Change() 
{ 
    return Task.Run(() => 
     {      
      try 
      {      
       TempData["Text"] = "Text 1"; 

      } 
      catch 
      { 
       TempData["Text"] = "Text 2"; 
      } 

     }); 
} 

你可以找到關於使用異步方法here您正在使用什麼版本的ASP.NET MVC的