Powershell中是否有锁定声明

Bac*_*ave 7 powershell

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

bea*_*ker 6

lock这样的PowerShell中没有本机语句,但是您可以使用Monitor Class获取\释放指定对象上的排他锁。在使用Runspaces时,它可用于在线程之间传递数据,这在David Wyatt的博客文章Thread Synchronization(在PowerShell中?)中得到了证明。

引用:

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

基本示例:

# 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

David还编写了功能齐全的Lock-Object模块,该模块实现了此方法。