Private/Invoke-ModuleSynchronized.ps1

function Invoke-ModuleSynchronized {
    param(
        [Parameter(Mandatory)][object]$SyncRoot,
        [Parameter(Mandatory)][scriptblock]$Action
    )

    if (-not $SyncRoot) {
        return & $Action
    }

    $lockTaken = $false
    try {
        [System.Threading.Monitor]::Enter($SyncRoot, [ref]$lockTaken)
        return & $Action
    }
    finally {
        if ($lockTaken) {
            [System.Threading.Monitor]::Exit($SyncRoot)
        }
    }
}