【问题标题】:Abort WebMethod Thread on server side在服务器端中止 WebMethod 线程
【发布时间】:2013-09-03 08:32:23
【问题描述】:

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

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

当然,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

【问题讨论】:

    标签: asp.net jquery webmethod


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我不担心回收。如果在应用程序期间发生这种情况,则应重新启动所有会话、缓存……这在过去不是问题。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 2020-01-23
      • 2011-02-17
      • 2014-10-21
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多