C#多线程Thread.Abort()
看了很多⼈在使⽤Abort()⽅法来终⽌线程的运⾏,本⽂简单介绍下该⽅法的具体作⽤,以及说明下危险性,以及正确的停⽌线程的⽅式。
Abort的作⽤
Abort具有⽴即终⽌线程的作⽤,⽐如下⾯的代码:
static void MyMethod()
{
Console.WriteLine("多线程代码1");
Thread.Sleep(1000);
Console.WriteLine("多线程代码2");
Thread.Sleep(1000);
/
/假设在多线程中,代码执⾏到此处的时候,外部调⽤了 Abort ⽅法,那么在接下来的下⾯的代码都不会再具备执⾏。
Console.WriteLine("多线程代码3");
Thread.Sleep(1000);
Console.WriteLine("多线程代码4");
Thread.Sleep(1000);
Console.WriteLine("多线程代码5");
Thread.Sleep(1000);
}
Thread.ResetAbort() 的使⽤
static void MyMethod()
{
try
{
Console.WriteLine("多线程代码1");
Thread.Sleep(1000);
Console.WriteLine("多线程代码2");
Thread.Sleep(1000);
}
catch (ThreadAbortException)
{
Console.WriteLine("捕获到Abort产⽣的异常");
Thread.ResetAbort(); //如果在代码中捕获到Abort的调⽤产⽣的异常,这⾥是使⽤Thread.ResetAbort();⽅法的话下⾯的代码将会继续执⾏。
}
Console.WriteLine("多线程代码3");
Thread.Sleep(1000);
Console.WriteLine("多线程代码4");
Thread.Sleep(1000);
Console.WriteLine("多线程代码5");
Thread.Sleep(1000);
}
我们来看看运⾏效果:
Abort 的危险性
Abort虽然可以⽴即强制终⽌线程,但是带来的危险也是明显的,所以我们⼀定要知道代码的具体作⽤,⽤起来会安⼼。
假设在多线程的代码中包含了多段的 INSERT 数据库类的⽅法,那么你调⽤ Abort 很可能就只能执⾏了⼀部分 INSERT 语句,⽽⼀部分没执⾏导致数据库的这段数据不完整。
正确的停⽌线程的⽅式
writeline方法的作用那么有⼈问了,如何正确的停⽌多线程呢, 其实多线程在执⾏完毕指定的⽅法就停⽌了多线程在执⾏完毕指定的⽅法就停⽌了
也就是说只要指定的⽅法执⾏到最后的末尾 “}” 则就是完成了多线程的使命,也会在GC 中进⾏销毁。所以我们不必调⽤Abort()⽅法去强迫终⽌线程。
下⾯是正确的使⽤多线程的例⼦:
运⾏效果:
原:
⼀个线程abort 以后,不能重启,只能重新new 了 class Program
{
static bool _isExit = false;
static void Main(string[] args)
{
Thread th = new Thread(MyMethod);
th.Start();
//让其运⾏5秒后停⽌
Thread.Sleep(5000);
_isExit = true;
Console.ReadLine();
}
static void MyMethod()
{
while (_isExit == false)
{
Console.WriteLine("多线程运⾏中...");
Thread.Sleep(1000);
}
Console.WriteLine("多线程停⽌退出");
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论