Try-Finally 与 Thread.BeginCriticalRegion

top*_*l32 5 .net c# multithreading

据我了解,在线程中止生效之前,必须完成 finally 块。应该出于什么目的Thread.BeginCriticalRegion而使用,冒着终止应用程序域的风险?

例子:

try
{
}
finally
{
    CriticalOperation();
}
Run Code Online (Sandbox Code Playgroud)

或者

Thread.BeginCriticalRegion();
CriticalOperation();
Thread.EndCriticalRegion();
Run Code Online (Sandbox Code Playgroud)

xan*_*tos 4

为了使其变得非常简单,try... finally...请进行防护Thread.Abort(该finally部分受到完全保护并且不能被中断/将始终执行),同时Thread.BeginCriticalRegion()只向.NET运行时提供一些元信息:

来自https://learn.microsoft.com/nl-nl/archive/blogs/bclteam/constrained-execution-regions-and-other-errata-brian-grunkemeyer

关键区域并没有真正做太多事情。

...

关键区域的第一个作用是通知 CLR 托管代码块正在持有锁

(请注意,这只是信息......运行时所做的是它的问题。这里不能保证)

第二个效果是该代码块内的内存分配被标记为应用程序域关键。

然后它解释运行时应该优先为该代码块分配内存......因此运行时的其他元信息对程序员没有保证

  • @toprel32 只有当你为 Microsoft 工作时才应该使用 Thread.BeginCriticalRegion :-) 所有这些关于 Thread.BeginCriticalRegion 的胡言乱语可能都是万金油,没有以无人知晓的秘密方式记录和实现:-)尝试...最后`反而是非常真实、非常实用、非常有效:-) (2认同)