4

我有一个 Flex 应用程序,它调用一个搜索大型文档集合的函数。根据搜索词,用户可能希望停止来自 flex 的请求。

我不仅要阻止 flex 应用程序期待请求,还要停止 CFC 请求。这可能吗?这样做的最佳方法是什么?

4

4 回答 4

6

我认为没有直接的方法可以从外部停止页面调用。根据文档,只有线程本身及其父线程可以中止给定线程。

但是,您可以在共享范围内为给定线程设置标志。

假设您调用了一个开始一些后台处理的方法。它生成一个唯一的线程 ID 并将其返回给调用者。线程在(例如)应用程序范围内寻找一个告诉它停止的标志。它检查后台进程的每个子步骤。它可以在抛出标志的任何时候中止。

要抛出标志,请添加一个 abort 方法,该方法采用要中止的线程的名称,以及足够的安全性以确保第 3 方不能只是开始杀死线程。

于 2008-10-02T19:08:26.080 回答
2

为了添加到 Ben Doom 的答案,我将包含一些示例代码,以说明可以实现的方式。有多种命名方法和方式,组织和调用下面的代码,但希望它会有所帮助。

在请求启动期间的某个时刻,将有关进程的信息存储在共享范围内,并将 ID 返回给客户端。以下是可用于页面或远程请求的示例函数。

<cffunction name="createProcess" output="false">
  <cfset var id = createUUID()>
  <cfset application.processInfo[id] = {
    progress = 0,
    kill = false
  }>
  <cfreturn id />
</cffunction>

然后客户端可以通过轮询服务器来检查进度,或者提交请求以终止进程

<cffunction name="getProcessProgress" output="false">
  <cfargument name="processID" required="true">
  <cfreturn application.processInfo[arguments.processID].progress />
</cffunction>

<cffunction name="killProcess" output="false">
  <cfargument name="processID" required="true">
  <cfset application.processInfo[arguments.processID].kill = true />
</cffunction>

然后,实际的服务器端进程可以调用一个函数,例如在循环期间,以检查它是否应该中止处理并酌情清理任何工作。

<cffunction name="shouldKillProcess" output="false">
  <cfargument name="processID" required="true">
  <cfreturn application.processInfo[arguments.processID].kill />
</cffunction>
于 2008-10-07T20:05:24.663 回答
1

如果您使用的是 ColdFusion 8,则可以使用该<cfthread>标签。您可以在其自己的线程上生成搜索进程,然后根据需要使用远程调用终止搜索线程。

于 2008-10-02T18:25:48.430 回答
0

您可以使用<cfabort/>or以编程方式结束请求<cfsetting requesttimeout="0"/>- 但这是在 CF 服务器端,我认为这不是您要问的?

远程结束它...好吧,如果您有 FusionReactor,则可以使用 Flex 联系它并让它中断您的请求。(你当然可以尝试在 FusionReactor 中结束请求,但 Flex 是否真的可以要求 FR 停止它......如果有办法做到这一点,你必须在 FR 邮件列表中询问。)


可能的替代解决方案是尝试构建搜索,以便它可以处理多个请求,但这是否可行将取决于您正在搜索的内容。

于 2008-10-02T18:17:43.380 回答