【发布时间】:2015-06-18 23:46:51
【问题描述】:
使用
SqlDataSourceEnumerator.Instance.GetDataSources();
在正在运行的线程中,调用 thread.Abort() 来杀死进程是否安全?
注意:这是后台工作者中的一个线程。我需要能够取消后台工作人员,但如果那条线路阻塞则不能取消
【问题讨论】:
标签: c# multithreading
使用
SqlDataSourceEnumerator.Instance.GetDataSources();
在正在运行的线程中,调用 thread.Abort() 来杀死进程是否安全?
注意:这是后台工作者中的一个线程。我需要能够取消后台工作人员,但如果那条线路阻塞则不能取消
【问题讨论】:
标签: c# multithreading
如果线程在非托管代码中阻塞,Thread.Abort() 将不会做任何事情,直到线程无论如何都返回到托管代码,您似乎在您的注释中确认了这一点。
所以这个问题有点不清楚 - 调用 Thread.Abort() 本质上是安全的,因为它只会中止在托管代码中运行的线程。那么当你说“安全吗”时,你担心什么危险?
如果您需要能够中止非托管调用,一种方法是在单独的进程中将它们分离出来,这样您就可以使用 Process.Kill()。然后,您将处理清理工作的工作交给了操作系统。当然,不利的一面是,您必须执行一些样板代码才能将数据发送到流程或从流程发送数据。
【讨论】:
我认为没有人可以完全保证这一点,因为有许多非托管库是通过数据库连接调用的。
服务用户的最佳做法是处理所有与您的 sql 连接相关的一次性对象,您应该期望是安全的。
因此,只要所有一次性物品都得到妥善处理,在这里中止就可以了。
【讨论】: