加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

你如何取消AJAX长期运行的MVC动作客户端(在javascript中)?

发布时间:2020-12-16 03:08:44 所属栏目:百科 来源:网络整理
导读:我有一个长时间运行(4-10秒)的MVC操作,它运行来自AJAX调用的报告.在运行时,用户可以更改参数并运行其他内容,因此我在制作另一个之前取消了AJAX请求. 所以,例如(jQuery中的示例,但无论如何都会出现问题): // If we have an active request and it's not comp
我有一个长时间运行(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:

[If] two concurrent requests are made for the same session (by using
the same SessionID value),the first request gets exclusive access to
the session information. The second request executes only after the
first request is finished.

因此第二个请求在第一个请求完成之前无法访问会话.使用异步MVC操作似乎并没有解决这个问题,因为操作仍然需要能够对会话进行更改.

是否可以在不使用AsyncController或[SessionState(SessionStateBehavior.ReadOnly)]的情况下停止一个操作并启动下一个操作?

如果不是都需要?

[SessionState(SessionStateBehavior.ReadOnly)]或完全禁用会话足以允许从同一会话并发访问控制器操作.所以第二个请求(来自同一个会话)不需要在处理之前等待第一个请求完成.至于取消服务器上的第一个操作,嗯,这将更难.您必须将每个任务与唯一ID相关联,并在启动新任务时将此任务ID返回给客户端.然后,当您通过调用.abort()取消客户端上的AJAX请求时,您可以触发另一个AJAX请求到其他控制器操作并将其传递给唯一的任务ID.此控制器操作本身将设置一些公共标志以指示要停止的第一个操作.

TPL具有内置的取消支持,您可以查看它以简化它,以避免将同步它们的2之间的共享数据结构.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读