2013-02-25 53 views
5

我试图使用Powershell中的Task类异步运行一个操作。 但我发现了以下异常:在PowerShell中使用Task类

Id      : 1 
Exception    : System.AggregateException: One or more errors occurred. ---> System.Management.Automation.PSInvalidOperationException: There is no Runspace available to 
         run scripts in this thread. You can provide one in the DefaultRunspace property of the System.Management.Automation.Runspaces.Runspace type. The script 
         block you attempted to invoke was: Write-Host "hey!" 
          at System.Management.Automation.ScriptBlock.InvokeAsDelegateHelper(Object dollarUnder, Object dollarThis, Object[] args) 
          at System.Threading.Tasks.Task.Execute() 
          --- End of inner exception stack trace --- 
         ---> (Inner Exception #0) System.Management.Automation.PSInvalidOperationException: There is no Runspace available to run scripts in this thread. You can 
         provide one in the DefaultRunspace property of the System.Management.Automation.Runspaces.Runspace type. The script block you attempted to invoke was: 
         Write-Host "hey!" 
          at System.Management.Automation.ScriptBlock.InvokeAsDelegateHelper(Object dollarUnder, Object dollarThis, Object[] args) 
          at System.Threading.Tasks.Task.Execute()<--- 

Status     : Faulted 
IsCanceled    : False 
IsCompleted   : True 
CreationOptions  : DenyChildAttach 
AsyncState    : 
IsFaulted    : True 
AsyncWaitHandle  : System.Threading.ManualResetEvent 
CompletedSynchronously : False 

我的代码:

$delegate = [System.Action]{ Write-Host "Test" } 
[System.Threading.Tasks.Task]::Run($delegate) 

回答

3

这将需要大量的工作来获取PowerShell和Task工作。 Task是PowerShell直接运行的低级构造。

要异步执行PowerShell操作,请使用jobs

+3

运行空间的实现比较棘手,但可以[更高性能](http://learn-powershell.net/2012/05/13/using-background-runspaces-instead-of-psjobs-for-better-performance /)。 – user2871239 2014-12-02 19:23:45