0

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

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

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

由于 webmethod 本身是一个异步线程,我不能获取该线程的实例,将其存储在某个字典中,在那里我可以中止对用户的旧未完成请求并在完成时删除请求?

<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
4

2 回答 2

0

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

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

于 2013-09-03T09:58:24.790 回答
0

如果我理解正确,您希望有一些带有请求队列的全局变量字典,以便任何 Web 方法执行都可以共享同一个字典?

使用全局变量是一件棘手的事情,IIS 应用程序池可能随时重启。我在某处读到,它在 IIS 上每 24 或 29 小时自动回收一次。所以全局变量值可能会丢失。

与问题相关的线程: Appdomain回收究竟是什么

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

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

于 2013-09-03T08:46:11.850 回答