internal static void ReleaseClient(RdpClient client) { try { client._server = null; Program.TheForm.RemoveFromClientPanel(client.Control); } finally { AxHost rdpClient = client._rdpClient5; if (rdpClient != null) { client._rdpClient5 = null; rdpClient.Dispose(); } rdpClient = client._rdpClient6; if (rdpClient != null) { client._rdpClient6 = null; rdpClient.Dispose(); } rdpClient = client._rdpClient7; if (rdpClient != null) { client._rdpClient7 = null; rdpClient.Dispose(); } rdpClient = client._rdpClient8; if (rdpClient != null) { client._rdpClient8 = null; rdpClient.Dispose(); } } }
public void Connect(string rdpIP) { try { RDPSetSettings(); } catch (Exception ex) { if (parent.Controls.Contains(rdpControl)) { parent.Controls.Remove(rdpControl); } rdpControl.Dispose(); rdpControl = null; Log.Error("Setting the RDP client properties caused an exception.", ex); } RDPConnect(rdpIP, size.Width, size.Height); }
public void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (rdpControl != null) { // We need to dispose the rdp control. However, doing it immediately (in the control's own // OnDisconnected event) will cause a horrible crash. Instead, start a timer that will // call the dispose method on the GUI thread at the next available opportunity. CA-12902 Timer t = new Timer(); t.Tick += delegate { try { Log.Debug("RdpClient Dispose(): rdpControl.Dispose() in delegate"); rdpControl.Dispose(); } catch (Exception) { // We often get NullReferenceException here } t.Stop(); RdpCleanupTimers.Remove(t); Log.Debug("RdpClient Dispose(): Timer stopped and removed in delegate"); }; t.Interval = 1; RdpCleanupTimers.Add(t); Log.DebugFormat("RdpClient Dispose(): Start timer (timers count {0})", RdpCleanupTimers.Count); t.Start(); } else { Log.Debug("RdpClient Dispose(): rdpControl == null"); } } rdpControl = null; Log.Debug("RdpClient Dispose(): disposed = true"); disposed = true; } }