Making it thread-safe is actually quite easy:

private int _disposed;
public void Dispose()
{
    if (Interlocked.Exchange(ref _disposed, 1) == 0)
    {
        this.EndBlock();
    }
}