2017-01-22 14 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); 
    } 
} 

私は、Webページを取得したい、とその時にバックグラウンドでいくつかの他の仕事をするサーバー。

Loginメソッドを実行すると、タスクは実行されますが、スレッドが途中で停止したように、すべての作業が実行されるわけではありません。

このように動作しますか?

+1

同期呼び出しを使用してスレッドをn非同期メソッドでブロックしています。私は、タスクを呼び出す前に "Async Await"を追加する必要があると思います。一部の仕事としてマークした部分に背景作業がある場合は開始してください –

+1

[ASP.NETバックグラウンドタスク](http:// blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html)。 –

答えて

0

「ウェブページを取得し、そのときに他の人がバックグラウンドで作業するようにする」場合、これは正しい方法ではありません。

ビューを返すインデックスメソッドがあり、ページのdocument.ready()には、特定のコントローラメソッドへのajax呼び出しがあります。

また、非同期メソッドを使用する場合は、コントローラの非同期呼び出しを待って呼び出しの戻り値を取得する必要があります。

+0

AJAXを使用していますが、これが唯一の方法ですか?ブラウザの設定で電源を切ることができますか? – Aluminium

+0

私はあなたの質問にそれを見つけることができません。 –

+0

コードスニペットに更新しました。 – Aluminium

関連する問題