ASP.NET应用程序中的异步调用

ASP.NET应用程序中的异步调用,asp.net,multithreading,iis,asynchronous,Asp.net,Multithreading,Iis,Asynchronous,我不是在谈论异步页面或异步处理程序,我只是想知道在调用异步方法时是否应该担心任何副作用,该方法将在页面渲染完成后结束 给出的示例:每次用户登录时,我都必须启动一个繁重且耗时的SQL操作,但用户不需要知道该操作的结果,因此我可以使用beginexecutenquery执行查询,而无需通过任何回调,并完成页面呈现 我关心的是,如果HTTP调用结束(因为页面被服务),并且我异步执行的任何东西已经在运行,会发生什么?ASP.NET或IIS是否将剪切、销毁或作废任何内容 干杯。如果注册了回调,进程将返回以

我不是在谈论异步页面或异步处理程序,我只是想知道在调用异步方法时是否应该担心任何副作用,该方法将在页面渲染完成后结束

给出的示例:每次用户登录时,我都必须启动一个繁重且耗时的SQL操作,但用户不需要知道该操作的结果,因此我可以使用
beginexecutenquery
执行查询,而无需通过任何回调,并完成页面呈现

我关心的是,如果HTTP调用结束(因为页面被服务),并且我异步执行的任何东西已经在运行,会发生什么?ASP.NET或IIS是否将剪切、销毁或作废任何内容


干杯。

如果注册了回调,进程将返回以通知回调,否则仍将完成作业。AFAIK-ASP.NET或IIS都不会剪切/销毁或作废任何内容,因为执行已经命令,并且必须完成。

即使请求完成,该操作也将运行。但是,请注意,ASP.NET主机会主动杀死线程。当IIS有任何理由卸载或回收AppDomain时,您的后台线程将被终止。卸载发生在几种情况下。例如,在一段时间内没有收到新的请求。或者在某个时间段内从应用程序中触发太多异常。或者当内存压力过高时

如果你需要保证手术会完成,我想你可以做三件事:

  • 加速操作,使其能够同步运行,或
  • 将该繁重的操作移动到Windows服务并让其执行,或者
  • 您可以钩住该方法(正如Phill Haack解释的)(要求完全信任),以防止AppDomain在线程运行时崩溃

  • 恐怕这是不对的。当IIS决定回收AppDomain时,它将等待所有请求完成,然后直接卸载AppDomain,这意味着所有后台线程都将被终止。我不确定您是否理解我的评论。正如你所说,IIS会等待所有请求完成,我也这么说。除非AppDomain异常卸载,否则将执行请求