2012-07-18 36 views
2

語境

我有這個功能,同步表和幾個遠程IIS之間站點的列表:使用AJAX或ASP.NET進行異步調用?

namespace Dashboard.Controllers 
{ 
    public class SiteController : Controller 
    { 
     public ActionResult Synchronize() 
     { 
      SiteModel.synchronizeDBWithIIS(); 

      return Content("Cool."); 
     } 
    } 
} 

我希望異步調用此函數時,儀表板啓動和運行。

問題

  • 你勸我做一個$.get()(jQuery的),或者使用AsyncResult(ASP.NET)?

  • 可以使用Application_start() in Global.asax

  • 此外,我可以改進此控制器的同步更快嗎?

回答

2

以上都不是。這是你根本不應該在ASP.NET應用程序中做的事情。您可以閱讀以下有關此危害的文章:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

這是應該在單獨的應用程序中完成的事情。例如,您可以使用Windows任務調度程序定期運行此應用程序,並且它將負責執行此冗長的操作。

ASP.NET應用程序沒有比長時間阻塞工作線程更糟的了。在ASP.NET應用程序中實現這一點的唯一可行的解​​決方案是使用I/O完成端口。然後你可以使用AsyncController。但從我所看到的你的SiteModel.synchronizeDBWithIIS();是一種阻止方法,所以它不能完成。

但是如果你SiteModel提供了一個異步API以執行I/O密集型任務(不是CPU密集型),下面是它可以實現:

public class SiteController : AsyncController 
{ 
    public void SynchronizeAsync() 
    { 
     AsyncManager.OutstandingOperations.Increment(); 

     SiteModel.GetHeadlinesCompleted += (sender, e) => 
     { 
      AsyncManager.OutstandingOperations.Decrement(); 
     }; 

     SiteModel.synchronizeDBWithIISAsync(); 
    } 

    public ActionResult SynchronizeCompleted() 
    { 
     return Content("Cool."); 
    } 
} 

一旦你已經做了你是否會調用同步使用AJAX調用或正常調用的操作並不重要。重要的是,此操作現在是異步的並且不會阻止工作線程。它將其委託給目前執行冗長I/O操作的基礎API,使用Streams,套接字,數據庫連接上的BeginXXX,EndXXX方法...瞭解如果您的API尚未實現這個,你不能只是在新線程或異步委託中包裝一個同步方法並在那裏執行。我的意思是你可以,但是你從中獲益無一。

備註:不要被愚蠢地認爲這會讓你的操作更快。這沒有奇蹟。手術將與以前完全相同。只是在執行期間,您不會危害ASP.NET工作線程,並且您的其他請求會更快地執行。

+0

感謝您的幫助。我的SiteModel包含3個方法:'List getAllSitesFromIIS()'(獲得來自遠程API的JSON結果),'List getAllSitesFromDB()'(來自SQLServer2k8)和'void SynchronizeDBWithIIS()'。第三種方法稱前兩種。用2個'foreach',我比較了2個列表和插入/刪除/更新數據庫中的站點。 _a模型提供了異步API來執行I/O密集型task_,這是什麼意思? – 2012-07-18 14:55:44

+0

我的意思是一種非阻塞方法,它在網絡流,數據庫連接......上使用底層的BeginXXX和EndXXX方法。這似乎不是你的情況,所以你應該考慮從ASP.NET應用程序中卸載這個任務。 – 2012-07-18 15:07:06

+0

同意Darin除外 - MVC 4中的控制器是異步的,你不應該使用AsyncController。查看我的教程http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 – RickAndMSFT 2012-07-18 17:12:42

0

這兩個用於不同的目的。根據你所描述的,聽起來好像你想用AsyncResult來異步執行方法調用。