【问题标题】:C# Thread Abort safetyC# 线程中止安全
【发布时间】:2015-06-18 23:46:51
【问题描述】:

使用

SqlDataSourceEnumerator.Instance.GetDataSources();

在正在运行的线程中,调用 thread.Abort() 来杀死进程是否安全?

注意:这是后台工作者中的一个线程。我需要能够取消后台工作人员,但如果那条线路阻塞则不能取消

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    如果线程在非托管代码中阻塞,Thread.Abort() 将不会做任何事情,直到线程无论如何都返回到托管代码,您似乎在您的注释中确认了这一点。

    所以这个问题有点不清楚 - 调用 Thread.Abort() 本质上是安全的,因为它只会中止在托管代码中运行的线程。那么当你说“安全吗”时,你担心什么危险?

    如果您需要能够中止非托管调用,一种方法是在单独的进程中将它们分离出来,这样您就可以使用 Process.Kill()。然后,您将处理清理工作的工作交给了操作系统。当然,不利的一面是,您必须执行一些样板代码才能将数据发送到流程或从流程发送数据。

    【讨论】:

      【解决方案2】:

      我认为没有人可以完全保证这一点,因为有许多非托管库是通过数据库连接调用的。

      服务用户的最佳做法是处理所有与您的 sql 连接相关的一次性对象,您应该期望是安全的。

      因此,只要所有一次性物品都得到妥善处理,在这里中止就可以了。

      【讨论】:

        猜你喜欢
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多