Как делает поточную обработку в работе powershell?

Я хочу параллелизировать некоторые анализирующие файл действия с сетевой активностью в powershell. Быстрый Google для него, начинать-поток был похож на решение, но:

Термин 'начинать-поток' не распознан как название cmdlet, функции, файла сценария или действующей программы. Проверьте написание имени, или если путь был включен, проверьте, что путь корректен, и попробовать еще раз.

То же самое произошло, когда я попробовал начинать-задание.

Я также пытался возиться с Системой. Поточная обработка. Поток

[System.Reflection.Assembly]::LoadWithPartialName("System.Threading")
#This next errors, something about the arguments I can't figure out from the documentation of .NET
$tstart = new-object System.Threading.ThreadStart({DoSomething}) 
$thread = new-object System.Threading.Thread($tstart) 
$thread.Start()

Так, я думаю, что лучшее должно было бы знать то, что я делаю неправильно, когда я использую начинать-поток, потому что это, кажется, работает на других людей. Я использую v2.0, и мне не нужна совместимость сверху вниз.

27
задан Caesar 24 July 2010 в 16:37
поделиться

3 ответа

В Powershell нет встроенной команды Start-Thread.

Однако в версии V2.0 есть задания PowerShell, которые могут выполняться в фоновом режиме и могут рассматриваться как эквивалент потока. В вашем распоряжении следующие команды для работы с заданиями:

Name                              Category  Synopsis
----                              --------  --------
Start-Job                         Cmdlet    Starts a Windows PowerShell background job.
Get-Job                           Cmdlet    Gets Windows PowerShell background jobs that are running in the current ...
Receive-Job                       Cmdlet    Gets the results of the Windows PowerShell background jobs in the curren...
Stop-Job                          Cmdlet    Stops a Windows PowerShell background job.
Wait-Job                          Cmdlet    Suppresses the command prompt until one or all of the Windows PowerShell...
Remove-Job                        Cmdlet    Deletes a Windows PowerShell background job.

Вот пример работы с ними. Чтобы запустить задание, используйте start-job и передайте блок сценария, содержащий код, который вы хотите выполнить асинхронно:

$job  = start-job { get-childitem . -recurse }

Эта команда запустит задание, которое рекурсивно получит все дочерние файлы в текущем каталоге, и вы сразу же вернетесь в командную строку.

Вы можете проверить переменную $job, чтобы узнать, завершилось ли задание и т.д. Если вы хотите дождаться завершения задания, используйте:

wait-job $job

Наконец, чтобы получить результаты задания, используйте:

receive-job $job
32
ответ дан 28 November 2019 в 05:10
поделиться

Вы не можете напрямую использовать потоки таким образом, но вас нельзя винить в том, что вы пытались это сделать, поскольку, когда весь BCL лежит перед вами, не совсем глупо ожидать, что большая часть его work :)

PowerShell запускает блоки сценариев в конвейерах, которые, в свою очередь, требуют пространства выполнения для их выполнения. Некоторое время назад я писал в блоге о том, как использовать собственные сценарии MT для v2 ctp3, но техника (и API) остались прежними. Основными инструментами являются типы [runspacefactory] и [powershell] . Взгляните здесь:

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

Приведенный выше способ является наиболее легким подходом к написанию сценариев MT. В версии 2 есть поддержка фоновых заданий в виде start-job, get-job, но я подумал, что вы уже заметили это и увидели, что они довольно тяжелые.

10
ответ дан 28 November 2019 в 05:10
поделиться

На MSDN есть статья о фоновых заданиях в PowerShell по адресу http://msdn.microsoft.com/en-us/library/dd878288 (VS.85) .aspx .

Вы также можете прочитать о вакансиях в самом PowerShell.

> help about_Jobs
3
ответ дан 28 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: