2011-09-09 13 views
5

Ho un problema con PowerShell e forse qualcuno può aiutarmi. Sto usando PowerShell 2.0 e voglio creare e usare i thread. So che posso usare i lavori, ma non è quello che voglio. Voglio uno script, che crea i moduli di Windows ed esegue anche i thread in background. Poiché le forme hanno bisogno di STA, questo non è facile. L'esecuzione di "powershell.exe -sta" non è una soluzione.Problema di gestione thread Powershell

Di seguito è riportato il mio script che ho scritto, per la gestione semplice dei thread. Ma non funziona. Anche il nuovo thread non verrà creato. Qualche suggerimento, cosa c'è che non va? Per favore aiutami se puoi!

Saluti, Peter.

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.") 

risposta

1

Penso che la tua domanda è da qualche parte vicino a un post chiamato Powershell and Backgroundworker .Background lavoratore è per l'esecuzione di codice .NET in un thread in background.

PowerShell, sebbene funzioni su .NET, non produce linguaggio intermedio (IL). È un linguaggio interpretato e il suo codice non può essere eseguito al di fuori del contesto di uno spazio di esecuzione di PowerShell. forse puoi usare il tuo codice per creare il nostro Runspace di PowerShell e far girare il tuo script e riportare i risultati alla tua sessione principale.

+0

Grazie, ci provo se posso. –

4

Notato un paio di errori nella sceneggiatura. In primo luogo $ thread_job, provate questo invece:

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

è necessario mettere le parentesi intorno ThreadProc o sarà valutata piuttosto che passata come una funzione. In secondo luogo puoi semplicemente specificare il tipo per delegati come ThreadStart e PowerShell convertirà le cose per te; non c'è bisogno di New-Object.

In secondo luogo CurrentThread è un membro statico - sto cercando di indovinare $ Thread.currentThread è un errore di battitura e si intende:

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

immagino avrai ancora problemi a farla funzionare anche se - ogni volta che' Ho provato a usare thread in PowerShell prima che avessi sempre avuto brutti incidenti senza una vera spiegazione ...

Puoi scrivere un cmdlet in C# e chiamarlo invece? Potrebbe essere più facile fare le cose in questo modo: è possibile impostare un nuovo Runspace ed eseguire il comando nell'altro thread di Runspace.

EDIT

trovato questi link che potrebbero aiutare a:

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

+0

+1 Grazie per il link che aggiungi, illustra cosa stavo parlando della creazione di uno spazio di esecuzione. – JPBlanc

+1

Grazie per le correzioni! Il codice è corretto ora, ma ho anche avuto crash di PowerShell. In precedenza ho trovato i 2 collegamenti precedenti, ma non mi ha aiutato. Ho paura di dover cercare un'altra soluzione. –

Problemi correlati