在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
评论前必须登录!
注册