威胁已经被清除了

时间:2009-09-16 14:43:56

标签: asp.net multithreading server.transfer

我正在使用 Server.Transfer 。一切正常,但异常日志显示异常。

System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Thread.AbortInternal()
   at System.Threading.Thread.Abort(Object stateInfo)
   at System.Web.HttpResponse.End()
   at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm)
   at System.Web.HttpServerUtility.Transfer(String path)

任何想法都要避免上述异常。

6 个答案:

答案 0 :(得分:40)

此异常是通过调用Server.Transfer来暂停当前方法的执行 - 如果执行Response.Redirect,则会抛出同样的事情。

您有两个选择:

  • 抓住并重新抛出 ThreadAbortException /重新执行 Server.Transfer
  • 确定你 只在地方做Server.Transfer 它不会被抓住(推荐)

编辑:抓一点,http://support.microsoft.com/kb/312629还有其他一些建议要尝试,但我仍然推荐上面的#2。

答案 1 :(得分:9)

解决此问题的另一种方法是捕获生成的错误,而不是重新抛出它:

        catch (ThreadAbortException)
        { 
        }

答案 2 :(得分:8)

Caling Server.Transfer将调用Response.End,它始终抛出ThreadAbortException。这是一个“特殊”异常,因为虽然它可以在catch块中捕获,但它总是会在catch块的末尾重新抛出。我会让你的错误记录忽略ThreadAbortExceptions。

答案 3 :(得分:8)

Response.Redirect和Server.Transfer方法中出现此问题,因为两个方法都在内部调用Response.End。

此问题的解决方案如下。

对于Server.Transfer,请改用Server.Execute方法。

访问此链接以获取下载示例示例。 http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

答案 4 :(得分:0)

通过以下方式替换Response.End()有助于解决问题。

Response.Flush(); Response.Close();

参考Can we use Response.Flush () instead of Response.End()

答案 5 :(得分:0)

Response.End()替换为HttpContext.Current.ApplicationInstance.CompleteRequest();