![]() |
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,为什么还要费心清理呢?不管怎么说,你已经死定了。 |
![]() |
Eric · fgets_unlocked()用于多线程读取不同文件 3 年前 |
![]() |
RoyGNEU · 堆上的专用std::Vector是线程安全的吗? 3 年前 |
![]() |
JaiK · 在c中使用线程或队列写入文件# 7 年前 |
![]() |
Catalin Ghita · 如何以安全线程对象为值初始化哈希表? 7 年前 |
![]() |
Juan JuezSarmiento · C++删除对象,是否锁定? 7 年前 |
![]() |
Missa · 两个不同线程正在处理原子NSMutableArray 7 年前 |
|
user5682282 · 从其他线程读取值 7 年前 |