2011-09-09 23 views
5

Tengo un problema con Powershell, y tal vez alguien me puede ayudar. Estoy usando powershell 2.0 y quiero crear y usar hilos. Sé que puedo usar trabajos, pero eso no es lo que quiero. Quiero un script, que crea formularios de Windows y ejecuta hilos de fondo también. Como las formas necesitan STA, esto no es fácil. Ejecutar "powershell.exe -sta" no es una solución.Problema de manejo de la rosca Powershell

A continuación se muestra mi script que escribí, para el manejo simple de hilos. Pero no funciona. Incluso el nuevo hilo no se creará. Cualquier sugerencia, ¿qué está mal? ¡Por favor ayúdame si puedes!

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

Respuesta

1

creo que su pregunta está en algún lugar cerca de un post llamado Powershell and Backgroundworker trabajador .background es para la ejecución de código .NET en un subproceso en segundo plano.

Powershell, aunque funciona en la parte superior de .NET no produce un lenguaje intermedio (IL). Es un lenguaje interpretado y su código no puede ejecutarse fuera del contexto de un espacio de ejecución de powershell. quizás pueda usar su código para crear nuestro propio PowerShell Runspace y ejecutar su script allí, y ordenar los resultados del a su sesión principal.

+0

Gracias, intentaré esto si puedo. –

4

Noté un par de errores en su secuencia de comandos. En primer lugar $ thread_job, probar este lugar:

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

Es necesario poner los corchetes de ThreadProc o será evaluada en lugar de pasar como una función. En segundo lugar, puede especificar el tipo para delegados como ThreadStart y PowerShell convertirá las cosas para usted; sin necesidad de New-Object.

En segundo lugar CurrentThread es un miembro estático - Supongo $ Thread.currentThread es un error tipográfico y que significaba:

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

me imagino que usted todavía tiene problemas con su funcionamiento, aunque - siempre I' he intentado usar hilos en PowerShell antes de que siempre haya tenido bloqueos desagradables sin una explicación real ...

¿Se puede escribir un cmdlet en C# y llamar a eso en su lugar? Podría ser más fácil hacer las cosas de esa manera: podría configurar un nuevo espacio de ejecución y ejecutar su comando en el otro subproceso del espacio de ejecución.

EDITAR

encuentre este tipo de enlaces que pueden ayudarle 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 -y-powershell-execution-thread.aspx

+0

+1 Gracias por el enlace que agrega, ilustra de qué estaba hablando al crear un espacio de ejecución. – JPBlanc

+1

¡Gracias por las correcciones! El código es correcto ahora, pero también tengo fallas en PowerShell. Anteriormente encontré los 2 enlaces anteriores, pero no me sirvieron. Me temo que debo buscar otra solución. –

Cuestiones relacionadas