Мне нужно было скачать файл с помощью WebClient
в PowerShell 2.0, и я хотел показать ход загрузки, поэтому я сделал это следующим образом:
$activity = "Downloading"
$client = New-Object System.Net.WebClient
$urlAsUri = New-Object System.Uri($url)
$event = New-Object System.Threading.ManualResetEvent($false)
$downloadProgress = [System.Net.DownloadProgressChangedEventHandler] {
$progress = [int]((100.0 * $_.BytesReceived) / $_.TotalBytesToReceive)
Write-Progress -Activity $activity -Status "${progress}% done" -PercentComplete $progress
}
$downloadComplete = [System.ComponentModel.AsyncCompletedEventHandler] {
Write-Progress -Activity $activity -Completed
$event.Set()
}
$client.add_DownloadFileCompleted($downloadComplete)
$client.add_DownloadProgressChanged($downloadProgress)
Write-Progress -Activity $activity -Status "0% done" -PercentComplete 0
$client.DownloadFileAsync($urlAsUri, $file)
$event.WaitOne()
Я получаю сообщение об ошибке There is no Runspace available to run scripts in this thread.
для кода в обработчике $downloadProgress
, что является логическим. Однако как я могу предоставить Runspace
для потока, который (возможно) принадлежит ThreadPool
?
UPDATE: Обратите внимание, что оба ответа на этот вопрос заслуживают внимания, и я согласился бы, если бы мог.