Thread.Abort 的安全异常

Posted

技术标签:

【中文标题】Thread.Abort 的安全异常【英文标题】:Security Exception with Thread.Abort 【发布时间】:2011-08-29 00:30:54 【问题描述】:

当我致电Thread.Abort 时,我收到以下异常:

请求类型的许可 'System.Security.Permissions.SecurityPermission, mscorlib, 版本=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 失败了。

为什么会这样?

【问题讨论】:

提供更多细节,您的应用程序在做什么?你什么时候叫Abort?以管理员用户或普通用户身份运行在哪个操作系统等... @Davide:线程从服务器检索数据。我在 Windows 7 上作为普通用户运行。 【参考方案1】:

调用 Thread.Abort 需要 CAS(代码访问安全)权限 SecurityPermission\ControlThread。这与用户的权限无关,而是与 .NET CLR 授予您的代码的权限有关。

ControlThread 权限被视为“危险”权限。默认情况下,在 .NET 2.0 中,它只授予在机器上本地运行的程序集。我猜您的程序集要么是从本地机器外部加载的,要么是在托管的 CLR 实例(例如 ASP.NET)中运行的。无论哪种方式,都有适当的机制来增加程序集的 CAS 权限。如果您需要这方面的帮助,您需要更具体地了解您的程序集是如何加载的。

也就是说,使用 Thread.Abort 中止线程通常是not recommended。您可能需要考虑投资一种替代方法来停止线程执行,而不是花时间试图避免 SecurityException。

【讨论】:

它只是一个基本的桌面应用程序,虽然它确实使用了一些 dll

以上是关于Thread.Abort 的安全异常的主要内容,如果未能解决你的问题,请参考以下文章

.NET Thread.Abort 再次

Thread.Abort()方法冻结

C# - 线程中止异常(Thread Abort Exception)重新抛出自身

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

Thread.Abort() 并在 finally 之后延迟

可以像中止一个Thread(Thread.Abort方法)一样中止一个Task吗?