Jam*_*unn 8 javascript asp.net multithreading asynchronous httphandler
环境:
用户场景:
用户输入针对大型数据集的搜索条件.启动请求后,它们将导航到结果页面,等待数据加载,然后可以优化数据.
技术场景:
用户发送搜索条件后(通过ajax调用),UI调用后端服务.后端服务查询事务系统并将结果数据放入db"缓存" - 非规范化表,设置用于进一步细化数据(即排序,过滤).UI等待数据被缓存,然后在收到通知已完成的过程后,导航到结果页面.然后,生成的页面调用以从非规范化表中获取数据.
问题:
对于大型查询,搜索相对较慢(15-25秒),最终必须根据输入的条件查询许多系统.其他查询(<4秒)相对较快.
技术限制:
我们无法完全重新构建此搜索/结果系统.在UI和后端如何捆绑在一起之间存在许多复杂性.执行搜索条件后,页面是必需的(因为在StackOverflow上无法解决的约束).
我们也不能要求组织在搜索之前对数据进行非规范化,因为数据必须是实时的,即如果用户在其他系统中进行了更改,则数据必须在之后进行搜索时正确显示.
我想要遵循的流程:
我想欺骗一点.我想在fire-forget模型中通过异步HttpHandler发出"Cache"请求.
发出查询后,我想将页面转换为结果页面.
在转换页面上,我想轮询"缓存"表以查看数据是否已插入其中.
我想立即转换的原因是结果页面本身很昂贵(即使没有获取数据) - 在调用从缓存中获取数据的服务之前仍然需要2秒的加载时间.
题:
即使我使用javascript重定向导航离开页面,通过异步处理程序调用的ASP.NET线程是否可靠地继续处理?
技术界限2:
是的,我知道......这个搜索过程听起来效率不高.我现在无能为力.在我们继续研究如何重新构建它的同时,我正在尽我所能使它更好地发挥作用.
如果您的答案是:"扔掉它并重新开始",请不要回答.这是不可接受的.
是的。
有一个 Response.IsClientConnected 属性,用于了解长时间运行的进程是否仍然处于连接状态。此属性的原因是,即使客户端断开连接,进程也将继续运行,并且必须通过该属性手动检测并在发生过早断开连接时手动关闭。默认情况下,客户端断开连接时不会停止正在运行的进程。
引用此属性:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx
更新
仅供参考,现在使用套接字依赖这是一个非常糟糕的属性。我强烈鼓励您采取一种方法,允许您快速完成一个请求,该请求在某些数据库或队列中记录一些需要完成的长时间运行的任务,可能使用 RabbitMQ 或类似的东西,然后使用 socket.io 或类似的更新网页或应用程序完成后。