📅  最后修改于: 2023-12-03 14:39:45.268000             🧑  作者: Mango
在 C# 中,如果应用程序在运行时创建了线程,那么在应用程序退出时必须确保所有线程都已经被完全关闭,以免出现内存泄露或者程序异常退出等问题。
下面介绍两种方法来关闭所有线程并退出应用程序。
这种方法是比较暴力的一种关闭线程的方法,它会向线程发送一个“中断信号”,使线程从正在执行的代码中抛出一个 ThreadAbortException 异常,从而退出线程。
以下是使用 Thread.Abort() 方法的示例代码:
using System.Threading;
// 创建线程对象
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
// 在关闭应用程序时调用该方法
private void CloseAllThreads()
{
thread.Abort();
}
注意:使用 Thread.Abort() 方法会有一定的风险,因为它可能会在关闭线程的同时造成数据错误或者死锁等问题。
这种方法相比于第一种方法更加安全和稳定,它使用 CancellationTokenSource 对象来通知线程退出,而不是直接中断线程。
以下是使用 CancellationTokenSource 对象的示例代码:
using System.Threading;
// 创建 CancellationTokenSource 对象
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;
// 创建线程对象
Thread thread = new Thread(new ThreadStart(() =>
{
// 在线程中执行任务
while (true)
{
if (ct.IsCancellationRequested)
{
// 在收到取消请求时退出线程
break;
}
// 执行任务...
}
}));
thread.Start();
// 在关闭应用程序时调用该方法
private void CloseAllThreads()
{
cts.Cancel();
}
以上示例代码中,线程会在执行任务的过程中不断地检查 CancellationTokenSource 对象的状态来判断是否需要退出线程。
在使用多线程的应用程序中,必须确保所有线程在应用程序退出时都已经被完全关闭,以免出现内存泄露或者程序异常退出等问题。我们可以通过 Thread.Abort() 方法或者 CancellationTokenSource 对象来关闭所有线程并退出应用程序。其中,使用 CancellationTokenSource 对象是一种更加安全和稳定的方法。