在服务器端中止WebMethod线程

时间:2013-09-03 08:32:24

标签: asp.net jquery webmethod

我在ASP.NET站点中有一个Web方法,它可能运行很长时间并消耗大量CPU容量。在返回请求之前,用户还可以使用来自站点的其他或更多参数来发起新请求。在客户端,做一次中止:

if (xhrConfigurate != null) {
   xhrConfigurate.abort();
}

当然,abort不会停止服务器上的计算。我认为,这没关系,服务器将做它必须做的事情,但不会返回旧请求的结果。但似乎在某些情况下,服务器在及时处理所有请求方面存在问题。 这就是为什么我还希望在用户启动新请求时终止旧请求。我已经找到了一些使用scriptmanager的解决方案,但我想避免使用它。

由于webmethod本身是一个异步线程,我不能得到这个线程的实例,将它存储在一些字典中,在那里我可以中止旧的未完成的用户请求并在完成后删除请求吗? / p>

<WebMethod> Public Shared Function myRequest(ByVal params As String) As String
   'Get the dictionary with requests
   'Test the dictionary on old unfinsihed request for the user, if there is one: abort
   'Add this request to the dictionary

   'Do work...

   'If work finsihed: remove this request from dictionary
   Return result
End Sub

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要一些带有请求队列的全局变量字典,那么任何web方法执行都会共享同一个字典吗?

使用全局变量很棘手,IIS应用程序池可能会随时重启。在我读到的某个地方,它会在IIS上每24或29小时自动回收一次。因此全局变量值可能会丢失。

与问题相关的线程: What exactly is Appdomain recycling

我有ASP WebApi服务,我有类似的长期运行任务。我在控制台应用程序(主机)中托管ASP应用程序(没有IIS!),我使用ObservableCollection变量在AppDomain中存储请求。

然后每个请求线程都可以安全地访问该集合(如果我没有记错的话)。

答案 1 :(得分:0)

通常,在ASP.NET中运行长时间运行的进程是个坏主意。相反,您应该创建一个单独的服务器进程,并且您的ASP.NET代码应该将请求排入该进程。

您的服务器可以将唯一值返回给ASP.NET,然后ASP.NET可以将该值发送回网页。当用户发出请求时,您会将该值传递给ASP.NET,后者会将其传递给服务。该服务可以确定是否已经有一个使用该唯一值运行的请求,如果有,该服务可以中止该线程。