2011-05-04 51 views
1

我不是在谈论异步页面或异步处理程序,我只是想知道当我调用一个异步方法时,是否应该担心任何副作用完成渲染。ASP.NET应用程序中的异步调用

给出的示例:每次用户进行登录时,我都必须启动繁重且耗时的SQL操作,但用户无需知道该操作的结果,因此我可以使用BeginExecuteNonQuery执行查询无需传递任何回调,并完成渲染页面。

我担心的是,如果HTTP调用结束(因为页面被提供)以及异步执行的任何内容已经在运行,会发生什么?是ASP.NET还是IIS会削减,破坏,无效?

干杯。

回答

3

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

如果你需要保证,该操作将完成,我认为有三件事情可以做:

  1. 提高操作速度,以便它可以同步运行,或
  2. 此举是重新操作Windows服务并让它执行它,或者
  3. 您可以挂接到HostingEnvironment.RegisterObject方法(如Phill Haack解释here)(要求完全信任)以防止AppDomain在该线程运行时关闭。
0

如果您有一个回调注册,过程将回滚通知回调否则它仍然会完成作业。 AFAIK - ASP.NET或IIS都不会削减/销毁或使任何东西无效,因为执行已经完成并且必须完成。

+0

恐怕这是不正确的。当IIS决定回收一个AppDomain时,它将等待所有请求完成,并在此之后直接卸载AppDomain,这意味着所有后台线程都会被终止。 – Steven 2012-08-18 14:21:10

+0

我不确定你是否理解我的评论。正如你所说的IIS等待所有请求完成,我说的是同样的事情。除非AppDomain异常卸载,否则请求将执行 – sajoshi 2012-10-02 11:51:05