在Powershell中使用线程时,我们能否像C#一样使用“lock”语句? 或者我们是否需要使用“锁定”预编译的代码,即。使用Monitor类?
答案 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模块,该模块实现了这种方法。