【发布时间】:2010-07-14 08:02:48
【问题描述】:
我了解由于各种原因调用 Thread.Abort() 是错误的
- 可以锁定或处于其他关键区域
- 可能正在进行 I/O 操作,资源不会被清理
- 代码可以吞下 ThreadAbortException
- 可能正在进行状态更改操作,并使程序处于无效状态。
假设线程的Run()方法:
- 不使用并发原语。
- 不执行任何 I/O。
- 不接受此类异常。
- 暴露于只读 API,因此无法更改程序状态。
问题:
如果我要在这样的线程上调用 Abort(),造成的损害(关于损坏)是否已本地化?如在,我可以依靠我的程序,没有最近中止的线程,继续正常运行,还是我的整个进程/AppDomain/?那么可能已损坏?
如果我删除假设 1 和 2,abort() 损坏是否会本地化到它访问的特定并发原语和 i/o 资源?还是可以向外传播?
我为什么要鞭打 Thread.Abort() 死马:
我正在编写一个胖客户端 c# winforms 应用程序。一个功能是用户可以在 c# 中编写代码,该代码在我的域对象上实现接口,然后可以将其插入我的应用程序(代码通过 codedom 编译成程序集并使用反射加载);
所以这个想法是用户可以写
public class CustomComputation : IComputationThing
{
public void Compute(object context)
{
while (true) ;
}
}
然后我可以对生成的程序集进行反思,提取并实例化 CustomComputation 的实例,然后调用 Compute(...); 非常简单的东西。
问题在于,用户可以编写上面的内容——一个无限循环,或者他决定不想等待的其他指数时间计算。
当用户编写一些无限循环(或指数时间等)代码并希望从中中止时,我正在尝试研究我的选项以提供最佳恢复。虽然我确实打算要求用户遵守取消模式,但最终不能保证他们会这样做。
【问题讨论】:
-
嗯,即使 Abort 也不一定真的会中止(可以被阻止,正如你所提到的)。假设您想跳过更复杂的事情(例如,单独的 AppDomain),那么更简单的事情是:1)在启动线程之前将线程设置为后台 2)如果您决定它“失控”,您可以 Abort() 它,但是您也可以决定将优先级降到最低并保持不变:)
标签: c# .net multithreading