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