2011-09-09 76 views
5

我有一個PowerShell的問題,也許有人可以幫助我。我正在使用PowerShell 2.0,並且我想創建並使用線程。我知道我可以使用工作,但那不是我想要的。 我想要一個腳本,它創建Windows窗體,並運行後臺線程。由於表單需要STA,這並不容易。運行「powershell.exe -sta」不是一個解決方案。Powershell線程處理問題

下面是我編寫的腳本,用於簡單的線程處理。但它不起作用。即使是新的線程也不會被創建。任何建議,有什麼不對?如果可以,請你幫助我!

問候,彼得。

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

回答

1

我覺得你的問題是靠近一個叫Powershell and Backgroundworker裝置技術領域工作人員都在後臺線程上運行.NET代碼後。

Powershell雖然在.NET的頂部工作,但不會產生中間語言(IL)。它的解釋型語言及其代碼不能在PowerShell運行空間的 上下文之外運行。你也許可以使用你的代碼創建我們自己的PowerShell運行空間並在那裏運行你的腳本,並將結果編組回你的主會話。

+0

謝謝,我會盡力而爲,如果可以的話。 –

4

注意到腳本中有一些錯誤。首先$ thread_job,試試這個來代替:

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

你需要把周圍ThreadProc的括號,否則將被評估,而不是作爲一個函數傳遞。其次,您可以爲ThreadStart等代理指定類型,PowerShell將爲您轉換;不需要New-Object。

其次CurrentThread是一個靜態成員 - 我猜$ thread.CurrentThread是一個錯字,你的意思是:

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

我想象你仍然有問題,得到它的工作雖然 - 每當我」我曾經嘗試過使用PowerShell中的線程,但之前我一直有令人討厭的崩潰,沒有真正的解釋...

你可以在C#中編寫cmdlet並調用它嗎?以這種方式做事可能更容易 - 你可以設置一個新的Runspace並在另一個Runspace的線程中運行你的命令。

編輯

發現這些鏈接可以幫助你:

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感謝您添加的鏈接,它說明了我在談論創建一個運行空間。 – JPBlanc

+1

感謝您的更正! 現在的代碼是正確的,但我也遇到了PowerShell崩潰。 早些時候我找到了上述2個鏈接,但沒有幫助我。 恐怕我必須尋找另一個解決方案。 –