Right.  I was thinking of writing the following which is more verbose:

private bool _isDisposed;

public void Dispose() 
{
    if (this.TrySetIsDisposed()) 
    {
        this.EndBlock();
    }
}

private bool TrySetIsDisposed() 
{
    lock(this)
    {
        var wasDisposed = this._isDisposed;
        this._isDisposed = true;
        return wasDisposed;
    }
}


I like that Interlocked.Exchange is provided by .NET and makes the code more terse.  It's unfortunate that you can't use it for bools.  But I think it make sense to go with Interlocked.Exchange because of its brevity.  And it also may be an interesting side not to point to http://stackoverflow.com/questions/6164751/why-interlocked-exchange-does-not-support-boolean-type.