Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理较长的AJAX请求-发送响应但继续工作_C#_Java_Ajax_Multithreading_Jquery - Fatal编程技术网

C# 如何处理较长的AJAX请求-发送响应但继续工作

C# 如何处理较长的AJAX请求-发送响应但继续工作,c#,java,ajax,multithreading,jquery,C#,Java,Ajax,Multithreading,Jquery,我们使用jQueryAjax将指令集从浏览器发送到多层web应用程序中。第一个组件(组件A,用C#编写)验证指令并将其保存到数据库中,然后调用第二个组件(组件B,用Java编写,也通过HTTP调用),该组件在从同一数据库检索指令后对指令进行操作。浏览器客户端在提交作业后只是通过组件A轮询rdbms表,因此在发送请求后,它实际上是断开连接的,不需要等待组件A的响应 中间层(组件A)向客户端返回成功消息,确认任务已成功提交,但仍向任务处理程序(组件B)发出请求并释放其所有资源的最佳方式是什么?返回响

我们使用jQueryAjax将指令集从浏览器发送到多层web应用程序中。第一个组件(组件A,用C#编写)验证指令并将其保存到数据库中,然后调用第二个组件(组件B,用Java编写,也通过HTTP调用),该组件在从同一数据库检索指令后对指令进行操作。浏览器客户端在提交作业后只是通过组件A轮询rdbms表,因此在发送请求后,它实际上是断开连接的,不需要等待组件A的响应

中间层(组件A)向客户端返回成功消息,确认任务已成功提交,但仍向任务处理程序(组件B)发出请求并释放其所有资源的最佳方式是什么?返回响应是页面的最后一个操作,因此在将其发送回浏览器之前,我们必须在另一个线程中执行某些操作

我们考虑过的另一个选项是在组件B中发生这种情况,其中任务处理程序向中间层发送一个立即响应,确认请求,然后在后台继续工作。唯一的区别是我们在哪里生成额外的线程来完成工作


关于如何处理这个问题有什么好主意吗?

有一些方法可以通过生成线程手动处理这种情况。但是,您将面临的一个主要问题(我在编程经验中遇到过)是线程有点难以维护,如果处理不当,则有几个缺点。首先,错误处理能力有限,您必须有一个外部表(持久化表)或一个全局变量来记录或捕获所有这些错误。另一个问题是服务器可以接受的处理限制。如果在后台生成太多线程,服务器处理限制以及它同时发出的数据库请求将在以后成为一个难题

要避免的最佳解决方案是通过任何可用的后台任务框架。它们的优点是,它们将遵循生产者/消费者队列模式,并将通过在后台运行的单独守护进程为您执行所有跟踪。但是这里的缺点是守护进程仍然容易受到攻击


还有一个选择是集成排队或消息传递服务,如。这不仅可以扩展,而且在不同的语言中有一个非常好的实现。

我们在这种情况下所做的是:

  • 浏览器向组件A发送指令集
  • 组件A验证指令集
  • 组件A在新的“跟踪”ID下将指令集保存到DB
    STATUS=PENDING
  • 组件向组件B提出工作请求
  • “螺纹”在组件B中:
    • 组件B启动后台线程来做这项工作,后台线程做的第一件事是将“跟踪ID”的状态更新为
      status=RUNNING
    • 组件B主线程向组件A返回成功
  • 组件A从组件B获得“成功启动”消息,因此将其自己的“成功启动”消息连同“跟踪ID”返回浏览器。在这个阶段,组件A完成了请求,所有组件A资源都是空闲的
  • 浏览器可以对组件A进行不同的调用,以检查数据库中“跟踪ID”的状态
  • 同时,组件B的后台“线程”仍在进行工作,可能根据“跟踪ID”记录进度
  • 组件B完成工作,更新数据库中“跟踪ID”的状态,
    status=OK
    status=ERROR
    ,并放弃所有资源

从应用程序的角度来看,这一切的优点是无需等待工作完成。实际工作是由一个“后台”线程完成的,就像您在shell中用
nohup dothework&
启动它一样。关键是使用DB监视“跟踪ID”的状态。

当我遇到类似情况时,我创建了一个带有两个接口的web服务。一个将接收到一条指令并启动一个线程来处理该指令。另一个可以使用IPC轮询正在运行的线程,并返回指令的状态。我将使用ajax提交给第一个方法,成功后将启动一个javascript计时器,该计时器将每隔5秒发出一个ajax请求(或者任何轮询间隔需要的时间)获取状态并将其打印到浏览器。在请求的某一点上,您必须生成另一个线程以继续工作,同时仍向客户端返回消息。你是怎么做到的?当时,我正在用perl编写我的服务器,所以我只是在程序的那一点上分叉了服务器。在.net中,使用BackgroundWorker会更容易。您可以生成它,让它运行,并使用其报告进度的功能来跟踪客户端查询状态时每个线程的位置。我们考虑过实现MSMQ或WebLogic JMS,但由于政治原因,两者都被否决了。唉-我同意这是最好的处理方法。好吧,这似乎是最有意义的。看起来我需要向Java Servlet添加一个线程。出于好奇,您是否有任何技巧或好的链接可以帮助从servlet生成后台线程?不,对不起,我没有太多java经验。