gpt4 book ai didi

c# - 使用 AJAX 或 ASP.NET 进行异步调用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:17 24 4
gpt4 key购买 nike

上下文

我有这个功能可以在一个表和几个远程 IIS 之间同步站点列表:

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

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

我想在仪表板启动和运行时异步调用此函数。

问题

  • 您建议我执行 $.get() (jQuery) 还是使用 AsyncResult (ASP.NET)?

  • 可以在 Global.asax 中使用 Application_start() 吗?

  • 此外,我是否可以改进此 Controller 以加快同步速度?

最佳答案

以上都不是。这是您根本不应该在 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 调用还是普通调用来调用 Synchronize 操作都无关紧要。重要的是这个 Action 现在是异步的并且不会阻塞工作线程。它将此委托(delegate)给底层 API,该 API 目前执行冗长的 I/O 操作,在流、套接字、数据库连接等上使用 BeginXXX、EndXXX 方法,了解这一点很重要,如果您的 API 尚未实现因此,您不能只将同步方法包装在新线程或异步委托(delegate)中并在那里执行。我的意思是你可以,但你这样做绝对没有任何好处。

备注:不要误以为这会使您的操作更快。这没有奇迹。该操作将花费与以前完全相同的时间。只是在其执行期间您不会危及 ASP.NET 工作线程,并且您的其他请求将执行得更快。

关于c# - 使用 AJAX 或 ASP.NET 进行异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11542535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com