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