2011-09-09 15 views
5

Bir powershell sorunum var ve belki birisi bana yardımcı olabilir. Powershell 2.0 kullanıyorum ve oluşturmak ve thread kullanmak istiyorum. İşleri kullanabileceğimi biliyorum ama istediğim bu değil. Windows formları oluşturan ve arka plan iş parçacıklarını da çalıştıran bir komut dosyası istiyorum. Formlar STA'ya ihtiyaç duyduğundan, bu kolay değildir. "Powershell.exe -sta" çalıştırması çözüm değildir.Powershell iş parçacığı kullanımı sorunu

Basit iş parçacığı için yazdığım komut dosyası aşağıdadır. Ama işe yaramıyor. Yeni iplik bile oluşturulamaz. Herhangi bir öneri, yanlış olan nedir? Eğer yapabilirsen bana yardım et!

Saygılarımızla, 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.") 

cevap

1

Ben senin soru, bir arka plan iş parçacığı üzerinde .NET kod çalıştıran içindir Powershell and Backgroundworker .Background işçisi olarak adlandırılan bir direğe yakın bir yerde olduğunu düşünüyorum.

Powershell, bununla birlikte .NET'in üstünde çalışıyor olsa da ara dil (IL) üretmiyor. Yorumlanan bir dil ve kodu, powershell runspace'ın bağlamının dışında çalışamaz. belki kendi PowerShell Runspace'ımızı oluşturarak kodunuzu orada çalıştırabilir ve sonuçları ana oturumunuza geri döndürürsünüz.

+0

Teşekkürler, yapabilirsem deneyeceğim. –

4

Komut dosyanızda birkaç hata farkedildi.

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

Sen ThreadProc etrafında parantez koymak gerekir yoksa değerlendirilir ziyade bir fonksiyonu olarak aktarılır: Öncelikle $ thread_job, şunu yapmayı deneyin. İkinci olarak, sadece ThreadStart ve PowerShell gibi delegelerin türünü sizin için bir şeyler dönüştürebilirsiniz; Yeni Nesne'ye gerek yok.

İkincisi CurrentThread statik üyesidir - Ben $ thread.CurrentThread tahmin ediyorum bir yazım hatası olduğunu ve geliyordu:

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

Hala olsa çalışmak için onu alma sorunları gerekecek hayal - Ben ne zaman ve daha önce hiç bir gerçek açıklama olmadan kötü çökmeler yaşadım önce PowerShell içinde thread kullanarak çalıştı ...

C# 'da bir cmdlet yazabilir ve bunun yerine çağrı? Bu şekilde işleri yapmak daha kolay olabilir - yeni bir Runspace kurabilir ve komutunuzu diğer Runspace'ın dizisinde çalıştırabilirsiniz.

DÜZENLEME

size yardımcı olabilir bu bağlantıları Bulunan:

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 -ve-powershell-yürütme-thread.aspx

+0

+1 Eklediğiniz bağlantı için teşekkürler, bir koşu alanı oluşturma hakkında ne konuştuğumu gösterir. – JPBlanc

+1

Düzeltmeler için teşekkürler! Kod şu anda doğru, ancak powershell kilitlenmelerini de yaşıyorum. Daha önceki 2 bağlantıyı buldum ama bana yardımcı olmadı. Korkarım başka bir çözüm bulmalıyım. –

İlgili konular