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

时间:2012-02-14 05:50:45

标签: c# multithreading ironpython abort

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

2 个答案:

答案 0 :(得分:19)

  

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

将线程放在自己的进程中。当您希望它停止时,终止该过程

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

答案 1 :(得分:5)

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

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

    while shouldExit = false
        // do stuff
    

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

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