在Powershell中使用线程时,我们是否可以像在C#中一样使用"lock"语句?或者我们是否需要使用"锁定"预编译的代码,即.使用Monitor类?
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模块,该模块实现了此方法。
归档时间: |
|
查看次数: |
3474 次 |
最近记录: |