Object的新实例()

时间:2012-08-27 11:30:57

标签: c# .net

我遇到了Object构造函数的定义(来自mscorlib.dll的元数据)

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public Object();

我不明白ConstrainedExecutionCer.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 个答案:

答案 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