PowerShell中是否有锁定语句?

12

在PowerShell中使用线程时,我们能否像在C#中一样使用lock语句?

或者我们需要使用预编译到代码中的lock,即使用Monitor类?

1个回答

13

PowerShell中没有本地的lock语句,但是您可以使用Monitor类在指定对象上获取/释放独占锁。它可用于在线程池中处理Runspaces时在线程之间传递数据,这在David Wyatt的Thread Synchronization (in PowerShell?)博客文章中有所展示。

引用:

ICollection.IsSynchronized属性的MSDN页面提到,即使您正在处理同步集合,也必须显式锁定Collection的SyncRoot属性才能对其内容进行线程安全的枚举。

基本示例:

# Create synchronized hashtable for thread communication
$SyncHash = [hashtable]::Synchronized(@{Test='Test'})

try
{
    # Lock it
    [System.Threading.Monitor]::Enter($SyncHash)
    $LockTaken = $true

    foreach ($keyValuePair in $SyncHash.GetEnumerator())
    {
        # Hashtable is locked, do something
        $keyValuePair
    }
}
catch
{
    # Catch exception
    throw 'Lock failed!'
}
finally
{
    if ($LockTaken)
    {
        # Release lock
        [System.Threading.Monitor]::Exit($SyncHash)
    }
}

David还编写了完全功能的Lock-Object模块,实现了这种方法。


虽然这对所有的.NET,包括C#都适用(因此我会点赞),但是考虑到它的“强大领域”,我很难找到一个好的PowerShell使用案例。系统/命名信号量可能有用,也可能没有。[还有一些细节需要注意,比如$LockTaken的赋值问题。] - user2864740

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接