Powershell中是否有锁定声明

时间:2014-02-12 06:07:39

标签: powershell

在Powershell中使用线程时,我们能否像C#一样使用“lock”语句? 或者我们是否需要使用“锁定”预编译的代码,即。使用Monitor类?

1 个答案:

答案 0 :(得分:5)

PowerShell中没有本地lock语句,但您可以使用Monitor Class获取\释放对指定对象的独占锁定。在使用Runspaces时,它可用于在线程之间传递数据,这在David Wyatt的博客文章Thread Synchronization (in PowerShell?)中进行了演示。

引用:

  

ICollection.IsSynchronized Property的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模块,该模块实现了这种方法。