你如何取消AJAX长期运行的MVC动作客户端(在javascript中)?
我有一个长时间运行(4-10秒)的MVC操作,它运行来自AJAX调用的报告.在运行时,用户可以更改参数并运行其他内容,因此我在制作另一个之前取消了AJAX请求.
所以,例如(jQuery中的示例,但无论如何都会出现问题): // If we have an active request and it's not complete if(dataRequest && dataRequest.readyState != 'complete') { dataRequest.abort(); } dataRequest = $.ajax(...); 客户端这似乎工作正常,但已取消的请求仍在服务器上运行.例如,如果报告需要10秒,我取消一个并启动另一个,那么第二个请求需要20秒. 我认为这是由于session level locking:
因此第二个请求在第一个请求完成之前无法访问会话.使用异步MVC操作似乎并没有解决这个问题,因为操作仍然需要能够对会话进行更改. 是否可以在不使用AsyncController或[SessionState(SessionStateBehavior.ReadOnly)]的情况下停止一个操作并启动下一个操作? 如果不是都需要?
[SessionState(SessionStateBehavior.ReadOnly)]或完全禁用会话足以允许从同一会话并发访问控制器操作.所以第二个请求(来自同一个会话)不需要在处理之前等待第一个请求完成.至于取消服务器上的第一个操作,嗯,这将更难.您必须将每个任务与唯一ID相关联,并在启动新任务时将此任务ID返回给客户端.然后,当您通过调用.abort()取消客户端上的AJAX请求时,您可以触发另一个AJAX请求到其他控制器操作并将其传递给唯一的任务ID.此控制器操作本身将设置一些公共标志以指示要停止的第一个操作.
TPL具有内置的取消支持,您可以查看它以简化它,以避免将同步它们的2之间的共享数据结构. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |