C# 使用AJAX或ASP.NET进行异步调用? 上下文

C# 使用AJAX或ASP.NET进行异步调用? 上下文,c#,asp.net,ajax,asp.net-mvc,asynchronous,C#,Asp.net,Ajax,Asp.net Mvc,Asynchronous,我有此功能,可在一个表和多个远程IIS之间同步站点列表: namespace Dashboard.Controllers { public class SiteController : Controller { public ActionResult Synchronize() { SiteModel.synchronizeDBWithIIS(); return Content("Cool

我有此功能,可在一个表和多个远程IIS之间同步站点列表:

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

            return Content("Cool.");
        }
    }
}
我想在仪表板启动和运行时异步调用此函数

问题
  • 您建议我执行
    $.get()
    (jQuery)或使用
    AsyncResult
    (ASP.NET)

  • 可以在
    Global.asax
    中使用
    Application\u start()

  • 此外,我可以改进此控制器以加快同步速度吗


这两种方法用于不同的目的。但是,从您所描述的内容来看,您似乎希望使用
AsyncResult
异步执行方法调用。

以上都没有。这是在ASP.NET应用程序中根本不应该做的事情。您可以阅读以下有关此问题的危险性的文章:

这应该在单独的应用程序中完成。例如,您可以使用Windows任务调度器定期运行此应用程序,它将负责执行此冗长的操作

在ASP.NET应用程序中,没有什么比长时间阻塞工作线程更糟糕的了。在ASP.NET应用程序中实现此功能的唯一可行解决方案是使用I/O完成端口。那你就可以用一个。但是从我所看到的
SiteModel.synchronizedbwithis()
是一种阻塞方法,因此无法执行

但是,如果您的
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调用还是普通调用来调用Synchronize操作就无关紧要了。重要的是,此操作现在是异步的,不会阻塞工作线程。它将此委托给底层API,该API目前在流、套接字、数据库连接等上使用BeginXXX、EndXXX方法来执行冗长的I/O操作。。。重要的是要理解,如果您的API尚未实现这一点,那么您不能将同步方法包装在新线程或异步委托中并在那里执行。我的意思是你可以,但你从中毫无收获


备注:不要误以为这会让你的操作更快。这是没有奇迹的。操作所需的时间与之前完全相同。只是在执行过程中,您不会危及ASP.NET工作线程,其他请求的执行速度会更快。

谢谢您的帮助。My SiteModel包含3个方法:
List getAllSitesFromIIS()
(从远程API获取JSON结果)、
List getAllSitesFromDB()
(从SQLServer2k8)和
void SynchronizedBWithis()
。第三个方法调用前两个。使用2
foreach
,我比较了数据库中的2个列表和插入/删除/更新站点。您所说的提供异步API以执行I/O密集型任务的模型是什么意思?我指的是在网络流、dataabse连接等上使用底层BeginXXX和EndXXX方法的非阻塞方法。。。它操纵。这似乎不是你的情况,所以你应该考虑从ASP.NET应用程序中卸载这个任务。除了达林之外,同意MVC 4中的控制器是异步的,你不应该使用异步控制器。请参阅我的教程