连续第四次运行WPF应用程序后,出现以下错误:
由于超出了最大数量,因此无法创建运行空间 允许的连接数:3,对于策略方:MaxConcurrency。 请关闭现有的运行空间,然后重试。
通过Runspace
语句打开PowerShell
和using (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;
}
根据msdn,Runspace.Dispose
方法将调用Runspace.Close
(如果尚未关闭)。
要注意的最后一项:_psshell
和_psrunspace
仅被实例化一次,没有创建可能会拖延的偶然重复项目-cPSConnection
类正在使用Singleton模式。
我当前拥有的代码是对已经研究此问题的借鉴代码的积累,但我仍然没有运气。不知道在哪里找。任何帮助将非常感激。谢谢!