C#线程中止异常

C#线程中止异常,c#,multithreading,C#,Multithreading,线程中止()后会发生什么? 假设我有: Thread mWorker = new Thread(new ThreadStart(this.run)); .. mWorker.Start(); **where** private void run() { Logger.d(TAG, "run()"); ... try { while (this.mRunning){ ... } } catc

线程中止()后会发生什么?

假设我有:

Thread mWorker = new Thread(new ThreadStart(this.run));
..
mWorker.Start();

**where**

private void run() 
{
      Logger.d(TAG, "run()");

      ...
      try {
        while (this.mRunning){
          ...
        }
      } catch (ThreadAbortException tae){
           Logger.e(TAG,"some msg", tae);
           this.doSomething();
      } catch (IOException ioe){
           Logger.e(TAG,"some msg", ioe);
           this.doSomething();
      } catch (Exception e){
           Logger.e(TAG,"some msg", e);
           this.doSomething();
      } finally {
            gracefoulyClose();
      }

      Logger.d(TAG, "run() - ended");
}
线程更复杂。。但这里显示的是esential。那么调用Abort()时会发生什么呢?我是否可以继续调用doSomething()

因为我仍然在控制台中接收:

A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code
但我有一个陷阱。我不知道吗???

来自:

当调用Abort方法销毁线程时 公共语言运行库引发ThreadAbortException。 ThreadAbortException是一个可以捕获的特殊异常,但它 将在挡块末端再次自动升起。什么时候 如果引发此异常,运行时将执行所有finally块 在结束线程之前。因为线程可以执行无界 finally块中的计算或调用Thread.ResetAbort以取消 中止后,无法保证线程将永远结束。如果你 要等待中止的线程结束,可以调用 连接方法。Join是一个阻塞调用,直到 线程实际上停止执行

因此,换句话说,在执行
ThreadAbortException
的catch块后,会重新引发异常,因此最后一行记录器(例如
logger.d(标记,“run()-end”)
永远不会执行。但是由于对
this.doSoemthing
的调用位于
ThreadAbortException
的catch块中,因此它将执行


还要注意的是,您的
最终
确实执行了(请参阅上面的文档)。

您得到了一个ThreadAbortException,因为您的上下文在线程完成运行之前退出。在退出之前,需要等待线程完成。如果要退出,则需要确保线程能够接收到程序希望结束的信号(并据此采取行动),然后管理程序执行的代码必须等待线程完成:

if (mThread != null && mThread.IsAlive) {
    mThread.Join();
}

如果您担心线程永远不会退出,请使用超时重载,如果您按下计时器,请显式终止线程。

如果您使用的是代码中的where
response.redirect()然后它将在内部

运行
thread.abort()Response.Redirect(url,false)

那么我的试捕是否正常?因为当你使用“try{code a}catch(exe){}”时。。您知道代码A可能会出现异常。。但是我的代码没有抛出线程中止。。不知道我是不是在讲道理?我的代码是否将捕获AbortException?如果while循环中的某些内容导致ThreadAbortException,则是的,它将被捕获到catch块中。ThreadAbortException是一个特殊的异常,可能由.Net运行时引发,不一定是您的代码。当我使用
Response.End()时,我得到了
thread AbortException
,但如果我使用
HttpContext.Current.ApplicationInstance.CompleteRequest()
相反,我没有得到异常,但是在发送HTTP头之后,新的异常
服务器无法追加头,有什么建议吗?请检查mThread!=null&&mThread.IsAlive在一行中。如果mThread为null,则可能导致访问冲突。只要null检查是条件中的第一项,就不会引发错误。这仅仅是一个例子,并不意味着适合软件的所有环境。不要把注意力放在迂腐的问题上,而要更多地放在手头的问题上。