Проблема обработки резьбы Powershell - PullRequest
5 голосов
/ 09 сентября 2011

У меня проблема с PowerShell, и, возможно, кто-то может мне помочь.Я использую PowerShell 2.0, и я хочу создавать и использовать потоки.Я знаю, что могу использовать работу, но это не то, что я хочу.Мне нужен скрипт, который создает формы Windows, а также запускает фоновые потоки.Поскольку формам требуется STA, это не легко.Запуск «powershell.exe -sta» не является решением.

Ниже приведен мой сценарий для простой обработки потоков.Но это не работает.Даже новая тема не будет создана.Любое предложение, что не так?Пожалуйста, помогите мне, если можете!

С уважением, Питер.

function ThreadProc() {
    for ($i = 0; $i -lt 10; $i++) {
        $ApartmentState = [System.Threading.Thread]::CurrentThread.GetApartmentState()
        Write-Host "ThreadProc ($ApartmentState): $i"
        # Yield the rest of the time slice.
        [System.Threading.Thread]::Sleep(0)
    }
}

$ApartmentState = [System.Threading.Thread]::CurrentThread.GetApartmentState()
Write-Host "Main thread ($ApartmentState): Start a second thread."

$thread_job = New-Object System.Threading.ThreadStart(ThreadProc)
$thread = New-Object System.Threading.Thread($thread_job)
$thread.CurrentThread.SetApartmentState([System.Threading.ApartmentState]::STA)
$thread.Start()

for ($i = 0; $i -lt 4; $i++) {
    Write-Host("Main thread: Do some work.")
    [System.Threading.Thread]::Sleep(0)
}

Write-Host("Main thread: Call Join(), to wait until ThreadProc ends.")
$thread.Join()
Write-Host("Main thread: ThreadProc.Join has returned. Program end.")

Ответы [ 2 ]

4 голосов
/ 09 сентября 2011

Заметил пару ошибок в вашем скрипте. Во-первых, $ thread_job, попробуйте это вместо:

[System.Threading.ThreadStart]$thread_job = {ThreadProc};

Вам необходимо заключить скобки в ThreadProc, иначе он будет оценен, а не передан как функция. Во-вторых, вы можете просто указать тип для делегатов, таких как ThreadStart и PowerShell, которые будут преобразовывать вещи для вас; нет необходимости в New-Object.

Во-вторых, CurrentThread является статическим членом - я предполагаю, что $ thread.CurrentThread - опечатка, и вы имели в виду:

$thread.SetApartmentState([System.Threading.ApartmentState]::STA);

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

Можете ли вы написать командлет на C # и использовать вместо этого? Возможно, так будет проще - вы можете настроить новое Runspace и выполнить команду в потоке другого Runspace.

EDIT

Найдены следующие ссылки, которые могут вам помочь:

http://weblogs.asp.net/adweigert/archive/2008/04/29/powershell-threading-for-powershell-v1-0.aspx http://blogs.msdn.com/b/powershell/archive/2007/03/23/thread-apartmentstate-and-powershell-execution-thread.aspx

1 голос
/ 09 сентября 2011

Я думаю, что ваш вопрос где-то близок к сообщению под названием Powershell and Backgroundworker .Background worker для запуска .NET-кода в фоновом потоке.

Powershell, хотя работает на вершине .NET, не производит промежуточный язык (IL). Это интерпретируемый язык и его код не может работать за пределами контекст пространства выполнения PowerShell. Вы, возможно, можете использовать свой код, создав собственную PowerShell Runspace и запустив там свой сценарий, а также результаты обратно в ваш основной сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...