2011-09-09 39 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

は、私はあなたの質問は、バックグラウンドスレッドで.NETコードを実行しているためであるPowershell and Backgroundworker選択図】図ワーカーと呼ばれるポストにどこかに近いと思います。

Powershellは、.NETのトップで作業していますが、中間言語(IL)を生成しません。その解釈された言語とそのコードは、powershellの実行空間のコンテキスト外では実行できません。おそらくあなた自身のPowerShell Runspaceを作成してスクリプトを実行しているコードを使用して、 結果をメインセッションに戻すことができます。

+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#でコマンドレットを作成して呼び出すことはできますか?あなたは新しい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

+0

+1あなたが追加するリンクをありがとう、それは私がランスペースを作成することについて話していたものを示しています。 – JPBlanc

+1

訂正ありがとう! コードは今修正されましたが、PowerShellのクラッシュも発生します。 私は上記の2つのリンクを見つけましたが、私を助けませんでした。 私は別の解決策を探す必要があるのではないかと心配しています。 –