我遇到了Object
构造函数的定义(来自mscorlib.dll
的元数据)
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public Object();
我不明白ConstrainedExecution
(Cer.MayFail
)是什么意思,有人可以告诉我一个例子。
我遇到了这段代码,也告诉我这样写是否正确,
public class MyClass
{
private static object instanceLock = new object();
private void Func()
{
bool instanceLockTaken = false;
Monitor.TryEnter(instanceLock, ref instanceLockTaken);
//...
Monitor.Exit(instanceLock);
}
}
答案 0 :(得分:4)
通过锁定线程,您正在尝试实现约束执行。
来自:http://msdn.microsoft.com/en-us/magazine/cc163716.aspx
MayFail的Cer值用于表示面临时的信号 异步异常,代码可能无法在预期中完成 时尚。由于线程中止被延迟超过约束 执行区域,这实际上意味着您的代码正在做某事 这可能导致分配内存或可能导致堆栈 溢出。更重要的是,这意味着你必须采取可能的措施 调用此方法时会考虑失败。
在您的情况下,因为对象是静态的并且只创建一次,所以这不会是一个问题。
即使未获取锁定, Monitor.TryEnter
也会立即返回。它有一个布尔值,你没有检查,这样的东西可以工作:
Monitor.TryEnter(instanceLock, ref instanceLockTaken);
if (instanceLockTaken)
{
// Do stuff here
Monitor.Exit(instanceLock);
}
但是,这段代码意味着每次都不会执行if {}
块,如果你想获得每个线程的锁定,你需要做这样的事情:
lock(instanceLock)
{
// Do stuff here
}
这意味着一次只有一个线程可以运行lock {}
语句的内容,并且每次都会执行lock语句的内容。
在旁注中,您还可以使您锁定的对象readonly
:
private static readonly object instanceLock = new object();
答案 1 :(得分:2)
所以,一般来说,这里有2个问题。
1)可靠性合同是CLR团队用来支持受约束执行区域的工具。这是一个高级主题,但简单地说,构造描述了一个函数(或构造函数)是否会失败,如果是,那将会产生什么影响(没有影响,appDomain影响,流程影响,整个机器粉碎等)
2)您的代码段不正确。如果您不打算进一步检查,为什么要保存instanceLockTaken
?此外,如果锁定获取和释放之间发生异常,您将泄漏锁定。
考虑使用lock
语句,这是类似这样的语法糖:
bool instanceLockTaken = false;
try
{
Monitor.Enter(instanceLock, ref instanceLockTaken);
//...
}
finally
{
if (instanceLockTaken)
{
Monitor.Exit(instanceLock);
}
}
答案 2 :(得分:0)
Cer.Mayfail关键字表示如果标记的方法抛出异常,则数据可能处于无效状态;该对象的先前状态将不会被恢复。
答案 3 :(得分:0)
这是Monitor锁定的正确方法;
bool isLocked = false;
try
{
Monitor.Enter(instanceLock , ref isLocked);
// Do some things within the lock
}
finally
{
if (isLocked) Monitor.Exit(instanceLock);
}
至于cer.mayfail,此链接将提供更多信息http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx