2

我遇到了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);
    }
}
4

4 回答 4

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();

于 2012-08-27T11:47:01.630 回答
2

所以,一般来说,你在这里有两个问题。

1) 可靠性合约是 CLR 团队用来支持受限执行区域的工具。这是一个高级话题,但简单来说构造描述了一个函数(或构造函数)是否会失败,如果是,会产生什么影响(无影响,appDomain影响,进程影响,整机崩溃等)

2)您的代码片段不正确。instanceLockTaken如果您不打算进一步检查,为什么要保存?此外,如果在锁获取和释放之间发生异常,您将泄漏锁。考虑使用lock语句,它是这样的语法糖:

    bool instanceLockTaken = false;
    try
    {
      Monitor.Enter(instanceLock, ref instanceLockTaken);

    //...
    }
    finally
    {
      if (instanceLockTaken) 
      {
         Monitor.Exit(instanceLock);
      }
    }
于 2012-08-27T11:47:35.750 回答
0

Cer.Mayfail 关键字暗示如果被标记的方法抛出异常,则数据可能处于无效状态;对象的先前状态将不会恢复。

于 2012-08-27T11:47:14.760 回答
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

于 2012-08-27T11:53:33.903 回答