线程在.NET中止

Wil*_*ill 4 .net c# multithreading abort

我有一个分析文件并对数据库进行事务调用的线程,每个事务都有一个审计条目作为其事务的一部分.调用Thread.Abort()来停止处理文件有什么大不了的错吗?而不是散布各处丑陋的安全点?

中止呼叫后文件将被关闭.

Mar*_*ell 10

显而易见的问题是放弃交易的风险,这可能导致不确定时间(或直到超时)的阻塞.但你可以把各种各样的东西弄得一团糟 - 不可恢复的Monitor锁,信号量等,内存泄漏等等.

简而言之:尽可能努力避免不必中止线程,除非你确切知道它当时在做什么.而你能够知道它正在做什么的唯一方法就是它已经处于一个已知的"安全点"(使用你的术语) - 所以你也可以抛出一个例外或者其他东西让它以一种有管理的方式提升自己.

  • @Sergey:不幸的是,这些并不是唯一可以进行清理的地方.例如,`lock(x)`看起来像`Monitor.Enter(x)try {...} finally {Monitor.Exit(x); }`这意味着在Enter和try之间可以发生中止.此外,无法保证清理代码最终位于其他内部,它也可以是不会引发异常抛出的代码(因为它似乎是异常安全的,如果忽略异步异常,或者它是设置代码设置清理代码将使用的标志).Abort使所有这些事情变得非常复杂,以便做对. (3认同)

Eri*_*ert 8

最佳实践:仅在拆除过程时中止线程.