📜  如何在C#中终止线程

📅  最后修改于: 2021-05-29 21:13:54             🧑  作者: Mango

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

  1. 中止()
  2. 中止(对象)

中止()

此方法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();语句,我们可以终止thr线程的执行。

中止(对象)

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

句法:

public void Abort(object information);

在这里,该信息包含您要在线程停止时传递给它的任何信息。仅可使用ThreadAbortException的ExceptionState属性访问此信息。

例外情况:

  • 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方法的线程持有中止的线程所需的锁,则可能会发生死锁。
  • 如果在尚未启动的线程上调用Abort方法,则在调用Start时该线程将中止。
  • 如果在被阻塞或正在休眠的线程上调用Abort方法,则该线程将被中断,然后中止。
  • 如果在挂起的线程上调用Abort方法,则会在名为Abort的线程中引发ThreadStateException ,并将AbortRequested添加到中止的线程的ThreadState属性中。
  • 在调用Resume之前,不会在挂起的线程中引发ThreadAbortException。
  • 如果在当前正在执行非托管代码的托管线程上调用Abort方法,则在线程返回托管代码之前,不会引发ThreadAbortException
  • 如果有两个同时调用Abort的调用,则有可能一个调用设置状态信息,而另一个调用执行Abort。但是,应用程序无法检测到这种情况。
  • 线程上调用Abort之后,线程的状态包括AbortRequested 。由于成功调用Abort导致线程终止后,线程的状态将更改为Stopped。具有足够的权限,作为中止目标的线程可以使用ResetAbort方法取消中止。

参考:

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