如何在C#中终止线程?

在C#中, 可以使用以下命令终止线程Abort()方法。 Abort()抛出ThreadAbortException到它调用的线程。由于此异常, 线程被终止。的重载列表中有两种方法Thread.Abort方法如下:

Abort()

Abort(对象)

Abort()

此方法引发ThreadAbortException在调用它的线程中, 开始终止线程的过程。通常, 此方法用于终止线程。

语法如下:

public void Abort();

异常情况:

  • SecurityException:如果呼叫者没有所需的权限。
  • ThreadStateException:如果正在中止的线程当前处于挂起状态。

例子:

//C# program to illustrate the
//concept of Abort() method
//on a single thread
using System;
using System.Threading;
  
class ExampleofThread {
  
     //Non-Static method
     public void thread()
     {
         for ( int x = 0; x <3; x++) {
             Console.WriteLine(x);
         }
     }
}
  
//Driver Class
class ThreadExample {
  
     //Main method
     public static void Main()
     {
  
         //Creating instance for mythread() method
         ExampleofThread obj = new ExampleofThread();
  
         //Creating and initializing threads
         Thread thr = new Thread( new ThreadStart(obj.thread));
         thr.Start();
  
         Console.WriteLine( "Thread is abort" );
  
         //Abort thr thread
         //Using Abort() method
         thr.Abort();
     }
}

输出如下:

Thread is abort

说明:上面的示例显示了Thread类提供的Abort()方法的使用。通过使用thr.Abort();声明, 我们可以终止执行苏线。

Abort(对象)

此方法引发ThreadAbortException在调用它的线程中, 以开始终止线程的过程, 同时还提供有关线程终止的异常信息。通常, 此方法用于终止线程。

语法如下:

public void Abort(object information);

在这里信息包含要在线程停止时传递的任何信息。此信息只能通过使用以下方式访问异常状态的财产ThreadAbortException.

异常情况:

  • SecurityException:如果呼叫者没有所需的权限。
  • ThreadStateException:如果正在中止的线程当前处于挂起状态。

例子:

//C# program to illustrate the
//concept of Abort(object)
using System;
using System.Threading;
  
class ExThread {
  
     public Thread thr;
  
     public ExThread( string name)
     {
         thr = new Thread( this .RunThread);
         thr.Name = name;
         thr.Start();
     }
  
     //Enetring point for thread
     void RunThread()
     {
         try {
             Console.WriteLine(thr.Name +
                         " is starting." );
  
             for ( int j = 1; j <= 100; j++) 
             {
                 Console.Write(j + " " );
                 if ((j % 10) == 0) 
                 {
                     Console.WriteLine();
                     Thread.Sleep(200);
                 }
             }
             Console.WriteLine(thr.Name + 
                   " exiting normally." );
         }
         catch (ThreadAbortException ex) {
             Console.WriteLine( "Thread is aborted and the code is "
                                              + ex.ExceptionState);
         }
     }
}
  
//Driver Class
class GFG {
  
     //Main method
     static void Main()
     {
  
         //Creating object of ExThread
         ExThread obj = new ExThread( "Thread " );
         Thread.Sleep(1000);
         Console.WriteLine( "Stop thread" );
         obj.thr.Abort(100);
  
         //Waiting for a thread to terminate.
         obj.thr.Join();
         Console.WriteLine( "Main thread is terminating" );
     }
}

输出如下:

Thread  is starting.
1 2 3 4 5 6 7 8 9 10 
11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 
31 32 33 34 35 36 37 38 39 40 
41 42 43 44 45 46 47 48 49 50 
Stop thread
Thread is aborted and the code is 100
Main thread is terminating

重要事项:

  • 一种僵局如果调用Abort方法的线程持有中止的线程所需的锁, 则会发生这种情况。
  • 如果中止在尚未启动的线程上调用方法, 然后在调用启动时该线程将中止。
  • 如果中止在阻塞或正在休眠的线程上调用方法, 然后该线程将被中断, 然后中止。
  • If中止方法在挂起的线程上调用, 然后ThreadStateException被抛出到名为Abort的线程中, 并且中止要求被添加到线程状态被中止的线程的属性。
  • 一种ThreadAbortException直到被挂起的线程中才抛出恢复叫做。
  • 如果中止在当前正在执行非托管代码的托管线程上调用方法, 然后ThreadAbortException在线程返回托管代码之前不会抛出该错误。
  • 如果有两个电话中止同时出现, 则一个调用可能会设置状态信息, 而另一个调用可能会执行中止。但是, 应用程序无法检测到这种情况。
  • 后中止在线程上被调用, 线程的状态包括中止要求。由于成功调用Abort导致线程终止后, 线程的状态将更改为Stopped。如果有足够的权限, 则线程是中止可以使用ResetAbort方法。

参考:

  • https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort?view=netframework-4.7.2

来源:

https://www.srcmini02.com/68841.html

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?