2015-04-22 19 views
2

如果System.Management.Automation.Runspaces.Runspace.Open()碰巧位於System.Transactions.TransactionScope之內,它顯然會更改Transaction.Current,這會在事務處理時導致「System.InvalidOperationException」。在TransactionScope中調用Runspace.Open()會更改Transaction.Current並引發異常

所以這個:

using (var scope = new TransactionScope()) 
{ 
    using (var runspace = RunspaceFactory.CreateRunspace()) 
    { 
     runspace.Open(); 
    } 

    scope.Complete(); 
} 

拋出: 「Transaction.Current擁有的TransactionScope內發生變化。」

我想知道是否我在Transaction或Runspace中缺少任何關鍵參數,或者它與我的power-shell/MSDTC/etc配置有關?

+0

得到同樣的問題。你解決了嗎? – SimonGoldstone

+1

不,我不得不圍繞它重新設計我的代碼。 –

回答

2

自己也有同樣的問題。我的運行空間被埋在幾個嵌套的TransactionScope層中。在執行Runspace.Open()後,Transaction.Current被更改,並且按照OP的問題拋出Exception。

對我來說,解決方案是將代碼封裝在另一個TransactionScope中,但這次是TransactionScopeOption.Suppress參數。

using (var transactionScope = new TransactionScope(TransactionScopeOption.Suppress)) 
     { 
      IEnumerable<Object> results = null; 

      using (Runspace runSpace = RunspaceFactory.CreateRunspace()) 
      { 
       runSpace.Open(); 

       using (Pipeline pipeline = runSpace.CreatePipeline()) 
       { 
        Command command = new Command(script, true, true); 

        if (parameters != null && parameters.Any()) 
         foreach (var param in parameters) 
          command.Parameters.Add(param.Key, param.Value); 

        pipeline.Commands.Add(command); 

        results = pipeline.Invoke(); 
       } 

       runSpace.Close(); 

       transactionScope.Complete(); 

       return results; 
      } 
     } 

這對我來說非常合適。沒有更多的例外。