Попытка использования пространств выполнения для выполнения некоторых операций веб-очистки и вставки в базу данных.при попытке многопоточности задания более одного потока приводит к ошибкам блокировки базы данных и к аварийному завершению работы моего скрипта.Я использую соединение adodb с базой данных доступа.
Function InsertToTable1 {
param ($database,$query,$col2,$col3,$col4,$col5,$col6,$col7,$col8,$col9,$col10,$col11)
$OpenStatic = 3
$LockOptimistic = 3
$Connection = New-Object -ComObject ADODB.Connection
$Connection.Open("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=$database")
$Recordset = new-object -ComObject ADODB.Recordset
$Recordset.open($query,$Connection,$OpenStatic,$LockOptimistic)
$Recordset.AddNew()
$Recordset.Fields.Item("col2") = $col2
$Recordset.Fields.Item("col3") = $col3
$Recordset.Fields.Item("col4") = $col4
$Recordset.Fields.Item("col5") = $col5
$Recordset.Fields.Item("col6") = $col6
$Recordset.Fields.Item("col7") = $col7
$Recordset.Fields.Item("col8") = $col8
$Recordset.Fields.Item("col9") = $col9
$Recordset.Fields.Item("col10") = $col10
$Recordset.Fields.Item("col11") = $col11
$Recordset.Update()
$Recordset.close()
$Connection.close()
}
$code = @"
Function InsertToTable1 {$(Get-Command InsertToTable1 | Select -expand Definition)}
"@ #
$pool = [RunspaceFactory]::CreateRunspacePool(1,1) #[int]$env:NUMBER_OF_PROCESSORS+1
$pool.ApartmentState = "MTA"
$pool.Open()
$runspaces = @()
$scriptblock = {
......
InsertToTable1 $DB $Q1 $varState $varTown $varStreet $fullURL $varStyle $varModel $varDescription $varUseCode $varDate $varDate
......
}
foreach ($x in $xxxxx) {
$runspace = [PowerShell]::Create().AddScript($scriptblock).AddArgument($x).AddArgument($code)
$runspace.RunspacePool = $pool
# Add runspace to runspaces collection and "start" it
# Asynchronously runs the commands of the PowerShell object pipeline
$runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() }
}
while ($runspaces.Status.IsCompleted -notcontains $true) {}
$results = @()
foreach ($runspace in $runspaces ) {
$results = $runspace.Pipe.EndInvoke($runspace.Status)
$runspace.Pipe.Dispose()
}
$pool.Close()
$pool.Dispose()