什么是停止正在运行的线程的安全方法?

apl*_*vin 10 c# multithreading ironpython abort

我有一个包含执行IronPython脚本的线程.出于某种原因,我可能需要随时停止此线程,包括脚本执行.怎么做到这一点?第一个想法是Thread.Abort(),但它已知是邪恶的......

Eri*_*ert 19

什么是停止正在运行的线程的安全方法?

将线程放在自己的进程中.当你想要它停止时,杀死进程.

这是杀死线程的唯一安全方法.中止线程会严重破坏进程的稳定性并丢失用户数据.有没有办法避免"丢失用户数据"的情况,如果你真的,真的需要能够杀死一个线程,可以做任何事情.避免破坏正在调用中止的进程的唯一方法是完全使它们成为不同的进程.

  • @KevinCathcart:嗯,当然.但如果你有能力礼貌地控制*过程*那么你肯定也有能力礼貌地控制*一个线程*.如果你*可以*建立一个控制系统,那么一定要这样做; 我理解这个问题是"但是,如果我*不能*控制代码,但我现在想让它停止,我该怎么办?" (5认同)

Tud*_*dor 5

从你的问题和随后的评论中我可以建议你两个选项,还有一些额外的"警告":

  1. 如果你的线程在每次迭代时循环执行某些东西,你可以设置一个volatile布尔标志,使它在完成当前迭代后退出(伪代码因为我不熟悉python):

    while shouldExit = false
        // do stuff
    
    Run Code Online (Sandbox Code Playgroud)

    然后将标志设置为true您希望线程停止的时间,并在下次检查条件时停止.

  2. 如果您不能等待迭代完成并需要立即停止,那么您可以选择Thread.Abort,但绝对确保您无法在不一致的状态下保留打开的文件句柄,套接字,锁或其他任何类似的东西.

  • @Tudor:扩展你的优点:你知道什么比打开文件句柄更糟糕吗?**当只有一半用户数据被缓冲出来时关闭文件句柄,使文档处于中断状态,这样用户的数据都不可恢复**.与锁类似; 让显示器处于输入状态是不好的.在完成对关键用户数据的受保护编辑的代码之前退出监视器会更糟.人们表现得像流产线程一样糟糕,因为它留下了处理*分配*,但实际问题是它经常*过早地释放它们*. (4认同)
  • 确实,大多数情况下它很糟糕,但特别是因为人们倾向于使用线程进行I/O或其他类似的事情,如果线程被杀死将会处于不一致状态.如果你没有使用这样的线程,那么它是非常安全的. (2认同)