Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “ASP.NET例外情况”;“线程正在中止”;导致方法退出_C#_.net_Asp.net - Fatal编程技术网

C# “ASP.NET例外情况”;“线程正在中止”;导致方法退出

C# “ASP.NET例外情况”;“线程正在中止”;导致方法退出,c#,.net,asp.net,C#,.net,Asp.net,在下面的代码中,有时someFunctionCall()会生成异常: 线程正在中止 为什么代码块B中的代码从不运行?ASP.NET是否为每个方法调用启动一个新线程?我惊讶地发现,当这个异常发生时,块B中的代码从未运行,方法返回,我的应用程序继续运行。有人能解释一下吗 public void method() { // CODE BLOCK A //... try { someFunctionCall(); // this ca

在下面的代码中,有时
someFunctionCall()
会生成异常:

线程正在中止

为什么代码块B中的代码从不运行?ASP.NET是否为每个方法调用启动一个新线程?我惊讶地发现,当这个异常发生时,块B中的代码从未运行,方法返回,我的应用程序继续运行。有人能解释一下吗

public void method()
{
     // CODE BLOCK A
     //...    

     try 
     {
         someFunctionCall(); // this call is generating thread abort exception
     }
     catch(Exception ex)
     {
         // log exception message
     }

    // CODE BLOCK B
    // ...    
}

这是一个
ThreadAbortException
;这是一个特殊的异常,在每个catch块结束时自动重新调用,除非调用
Thread.ResetAbort()

ASP.Net方法,如
Response.End
Response.Redirect
(除非传递
false
),会将此异常抛出到当前页面的结束处理;您的
someFunctionCall()
可能正在调用这些方法之一

ASP.Net本身处理此异常,并调用
ResetAbort
以继续处理。

请尝试以下方法:

这是我的扩展方法:

 public static void WriteJSONObject(this HttpResponse response, object content) {
            response.ContentType = "application/json";
            response.Write(new JavaScriptSerializer().Serialize(content));
            response.End();

 }
和逻辑:

public void RegisterUser() {
    try {
        Response.WriteJSONObject(new { Result = "See hello" });
    } 
    catch (Exception err) {
        if (err.Message != "Thread was being aborted.")
            Response.WriteJSONObject(new { Result = err.Message });
        else {
            Response.End();
        }
    }
}

要解决此问题,请使用以下方法之一: 对于
Response.End
,调用
HttpContext.Current.ApplicationInstance.CompleteRequest
方法,而不是
Response.End
,以绕过对
应用程序EndRequest
事件的代码执行

对于
Response.Redirect
,使用重载
Response.Redirect(字符串url,bool endResponse)
,该重载为
endResponse
参数传递false,以抑制对
Response.End
的内部调用。例如:

Response.Redirect ("nextpage.aspx", false);
如果使用此解决方法,将执行
Response.Redirect
后面的代码。
对于
Server.Transfer
,请使用
Server.Execute
方法。

对我有效的方法是增加IIS上应用程序池的“空闲超时(分钟)”属性

我将其设置为“43200”,这是最大值


我还调整了回收设置…

那么我如何让它忽略该异常并继续执行块B中的代码呢?你确定要吗?如果someFunctionCall正在重定向或结束响应,您可能不应该继续它someFunctionCall的作用是什么?它会向第三方供应商发出XML-RPC调用。无响应结束或重拨。如果它是XML-RPC API的旧版本,我希望忽略它并继续使用默认值。在catch块中调用Thread.ResetAbort。另外,询问供应商例外情况是什么。异常的堆栈跟踪是什么?这是错误的。您不应该将异常的
消息
与硬编码字符串进行比较。相反,您可以编写
catch(ThreadAbortException){}catch(Exception ex){…}
。另外,如果已经存在
ThreadAbortException
,那么调用
Response.End
也没有意义。另外:上述解决方案对我来说不像大多数人那样有效。不管我做了什么都没用,所以这是我找到的唯一解决方案,效果很好;我是说这是个可怕的主意。您的代码正在解决与此问题无关的另一个问题。