1
17
这本书的配套网站有更多关于中止线程的信息 here .
第二个问题的答案是,在某些情况下,变量可以合法地为空。例如,GetFoo()可能在这里返回null,在这里,您不希望在隐式finally块中引发NullReferenceException:
要回答您的第三个问题,使中止安全的唯一方法(如果您正在调用框架代码)是在之后删除AppDomain。在许多情况下,这实际上是一个实用的解决方案(这正是LINQPad在取消正在运行的查询时所做的)。 |
2
8
两个场景之间实际上没有区别——在第二个场景中,ThreadAbort仍然可能发生在调用OpenText之后,但在将结果分配给读取器之前。 基本上,当您得到ThreadAbortException时,所有的赌注都会被取消。这就是为什么您不应该故意中止线程,而应该使用其他方法优雅地结束线程。 针对您的编辑——我再次指出,您的两个场景实际上是相同的。除非File.OpenText调用 完成并返回一个值,因此第一种方式与第二种方式写出代码没有区别。 |
3
6
通常地 展开干净,但在极端情况下无法保证每一位代码都能执行。一个更紧迫的例子是“如果电源故障会发生什么?”。
回复
|
4
4
有点离题,但是在线程中止期间lock语句的行为也很有趣。而lock相当于:
保证(由x86抖动)在Monitor.Enter和try语句之间不会发生线程中止。
生成的IL代码在.net 4中似乎不同:
|
5
2
语言规范明确指出第一个是正确的。
http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
MS规范(Word文档)
在线程中止的情况下,两种代码变体都可能失败。如果中止发生在计算表达式之后,但在分配给局部变量之前。
|
6
2
你把注意力集中在错误的问题上。ThreadAbortException同样可能会中止OpenText()方法。您可能希望它能够适应这种情况,但事实并非如此 具有尝试处理线程中止的try/catch子句。 请注意,文件不会永远保持打开状态。文件流终结器最终将关闭文件句柄。当然,当您继续运行并尝试在终结器运行之前再次打开文件时,这仍然会导致程序出现异常。尽管当你在多任务操作系统上运行时,这是你必须时刻保持警惕的事情。 |
7
2
虽然它不是中止安全的,但是任何具有未经整理的资源的可弃文件也应该实现终结器,它将 最后 运行并清理资源。终结器应该足够健壮,以处理未完全初始化的对象,以防线程在资源获取过程中中止。
一个
但是要 仔细的 ,应运行中止安全代码 快速的 和 不阻塞
检查空值会使
|
8
0
前者确实完全等同于后者。 如前所述,ThreadAbort确实是一件坏事,但它与使用任务管理器终止任务或关闭PC机并不完全相同。
也就是说,一旦你进入ThreadAbort,为什么还要费心清理呢?不管怎么说,你已经死定了。 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
rhymes · 如何让线程操作相同的java列表 2 年前 |