代码之家  ›  专栏  ›  技术社区  ›  Vladimir Kocjancic

如何使C#Powershell调用成员线程安全

  •  2
  • Vladimir Kocjancic  · 技术社区  · 14 年前

    public class PowerShellScript {
    
        public PowerShellScript() {
        }
    
        public Object[] Invoke( String strScriptName, NameValueCollection nvcParams ) {
            Boolean bResult = true;
            int n = 0;
            Object[] objResult = null;
            PowerShell ps = PowerShell.Create();
            String strScript = strScriptName;
    
            for (n = 0; n < nvcParams.Count; n++) {
                strScript += String.Format( " -{0} {1}", nvcParams.GetKey( n ), nvcParams[n] );
            }
    
            //ps.AddScript( @"E:\snapins\Init-profile.ps1" );
            ps.AddScript( strScript );
            Collection<PSObject> colpsOutput = ps.Invoke();
            if (colpsOutput.Count > 0)
                objResult = new Object[colpsOutput.Count];
    
            n = 0;
            foreach (PSObject psOutput in colpsOutput) {
                if (psOutput != null) {
                    try {
                        objResult[n] = psOutput.BaseObject;
                    }
                    catch (Exception ex) { 
                        //exception should be handeled properly in powershell script
                    }
                }
                n++;
            }
            colpsOutput.Clear();
            ps.Dispose();
    
            return objResult;
        }
    }
    

    方法调用返回powershell脚本返回的所有结果。

    一切都很好。只要它在一个线程中运行。由于我们调用的一些powershell脚本可能需要一个小时才能完成,而且我们不希望服务在这段时间内什么都不做,所以我们决定使用多线程。

    有什么办法解决这个问题吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Roman Kuzmin    14 年前

    你可以用 BeginInvoke() PowerShell 类而不是 Invoke() 你用的。在这种情况下,您可以异步执行脚本,并且不阻塞调用线程。但你也得回顾一下你的整个计划。旧的同步方法返回的结果可以在调用后立即使用。在新的异步方法中,这是不可能的。

    看见 http://msdn.microsoft.com/en-us/library/system.management.automation.powershell.begininvoke

        2
  •  1
  •   Vladimir Kocjancic    14 年前

    不管怎样。。。我在执行powershell命令时放弃了多线程。我创建了一个能够执行powershell脚本的小程序。然后,每个线程为该程序创建新进程。我知道这是一个有点开销,但它的工作。

    http://msdn.microsoft.com/en-us/library/system.management.automation.powershell%28VS.85%29.aspx ).