如何使用C#从WPF项目中处置Runspace和PowerShell对象

时间:2018-09-27 16:11:11

标签: c# wpf runspace

连续第四次运行WPF应用程序后,出现以下错误:

  

由于超出了最大数量,因此无法创建运行空间   允许的连接数:3,对于策略方:MaxConcurrency。   请关闭现有的运行空间,然后重试。

通过Runspace语句打开PowerShellusing (Runspace rs = RunspaceFactory.CreateInstance())...对象时,不会出现此错误,因为资源似乎已被正确处置。

但是,此应用程序的结构方式使事务之间的Runspace / PowerShell对象保持打开状态,因为与Office 365创建远程会话需要花费很长时间,并且我无法让用户等待重新建立每笔交易之间的远程会话。

当我让这些对象保持活动状态时,我必须手动处理它们,因为它们不包含在using语句中。我正在使用以下代码:

namespace O365Wrapper
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();
        }

        [STAThread]
        public static void Main()
        {
            App app = new App();
            cOofSettingsView view = new cOofSettingsView();
            app.Run(view);

            Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
            AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
        }

        public static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var ex = (Exception) e.ExceptionObject;
            MessageBox.Show(ex.Message);
            Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
        }

        public static void OnProcessExit(object sender, EventArgs e)
        {
            cPSConnection.DisposePowerShellEnvironment();
        }
    }
}

cPSConnection中:

private static void InitializePowerShellEnvironment()
{
    if (_psrunspace == null || _psshell == null)
    {
        _psrunspace = RunspaceFactory.CreateRunspace();
        _psrunspace.Open();
        _psshell = PowerShell.Create();
        _psshell.Runspace = _psrunspace;
        CreatePowerShellSession();
    }
}

public static void DisposePowerShellEnvironment()
{
    if (_psshell != null)
    {
        _psshell.Dispose();
    }
    if (_psrunspace != null)
    {
        _psrunspace.Dispose();
    }
    _psshell = null;
    _psrunspace = null;
}

根据msdnRunspace.Dispose方法将调用Runspace.Close(如果尚未关闭)。

要注意的最后一项:_psshell_psrunspace仅被实例化一次,没有创建可能会拖延的偶然重复项目-cPSConnection类正在使用Singleton模式。

我当前拥有的代码是对已经研究此问题的借鉴代码的积累,但我仍然没有运气。不知道在哪里找。任何帮助将非常感激。谢谢!

0 个答案:

没有答案
相关问题