2017-01-22 35 views
0

我想在我的web應用程序中異步執行一些工作。 我做這樣的方式:任務在ASP.NET MVC 5應用程序中不起作用

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    model.PhoneNumber = MakePhoneNumberStandard(model.PhoneNumber); 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    // This doesn't count login failures towards account lockout 
    // To enable password failures to trigger account lockout, change to shouldLockout: true 
    var result = await SignInManager.PasswordSignInAsync(model.PhoneNumber, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      { 
       using (var db = new ApplicationDbContext()) 
       { 
        var activated = DbHelper.Activated(db, model.PhoneNumber); 

        if (activated) 
        { 
         var browser = Request["browser"]; 
         var os = Request["os"]; 
         var ip = Request["ip"]; 

         LoginVerificationModel data = new LoginVerificationModel() 
         { 
          DbContext = db, 
          PhoneNumber = model.PhoneNumber, 
          Browser = browser, 
          Os = os, 
          Ip = ip, 
          AllocatedSeconds = AllocatedSecondsForLogin, 
          LoginTime = DateTime.UtcNow 
         }; 

         Task task = new Task(DbHelper.VerifyLoginAsyncWrap, data); 
         task.Start();        

         return View(); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Activation"); 
        } 
       } 
      } 
     case SignInStatus.LockedOut: 
      return View("Lockout"); 
     case SignInStatus.RequiresVerification: 
      return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
     case SignInStatus.Failure: 
     default: 
      ModelState.AddModelError("", "Invalid login attempt."); 
      return View(model); 
    } 
} 

我希望得到一個網頁,服務器當時在做一些後臺的工作別人。

當我執行登錄方法時,任務運行,但它不執行所有的工作,就像它的線程在中間停止一樣。

這樣工作嗎?

+1

你用n個異步方法阻塞同步調用的線程。我認爲你需要在調用task.Start之前添加「Async Await」,如果你在你標記爲//的部分中有後臺工作,那麼請開始工作。 –

+1

請參閱我的關於[ASP.NET後臺任務]的博客文章(http:// blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html)。 –

回答

0

這是不正確的方式,如果你「想要一個網頁,並在當時的服務器做一些其他的工作在後臺」。

有一個索引方法來返回您的視圖,並在頁面document.ready()你可以有一個Ajax調用你的特定控制器方法。

此外,如果您使用異步方法,則應等待您在控制器中進行的異步調用以獲取調用的返回值。

+0

上面的代碼中有一個「await」正在等待登錄。我使用AJAX,但這是唯一的方法嗎?如果可以在瀏覽器設置中關閉該怎麼辦? – Aluminium

+0

我無法在你的問題中找到。 –

+0

我已更新爲代碼段。 – Aluminium

相關問題