假设我有一个.NET Core 2.0/2.1程序。
有一个线程正在执行以下方法。 我想强制停止它。
重要提示: 协作式多任务处理(例如,使用CancellationToken)是一件好事,但这不是本例。 XY问题(https://en.wikipedia.org/wiki/XY_problem)确实存在,但我只想知道是否可以停止此线程。
重要提示: 协作式多任务处理(例如,使用CancellationToken)是一件好事,但这不是本例。 XY问题(https://en.wikipedia.org/wiki/XY_problem)确实存在,但我只想知道是否可以停止此线程。
while (true)
{
var i = 0;
try
{
Console.WriteLine($"Still alive {i++}");
}
catch (Exception e)
{
Console.WriteLine($"Caught {e.GetType().Name}");
}
}
尝试了几种选项:
- Thread.Abort - 抛出PlatformNotSupportedException,不是一个选项
- Thread.Interrupt - 仅适用于处于WaitSleepJoin状态的线程,这不是情况
- 调用来自Windows的kernel32.dll的TerminateThread等本地API方法。 这种方法有很多问题,如未释放的锁(https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717(v=vs.85).aspx)
关注点,从最重要到最不重要:
- 释放锁
- 在using指令中处理对象
- 实际收集分配的对象
(作为一种边缘情况,我们可以假设我们的线程根本没有执行任何堆分配)
while(true)
有什么问题?将其改为可控制的东西是否可行? - Theraot