void paletteWorker_DoOpenPalette(object sender, DoWorkEventArgs e) { try { IControlPalette p = e.Argument as IControlPalette; if (p == null) { throw new ArgumentException("Argument to worker must be an IControlPalette"); } p.Start(); e.Result = p; } catch (Exception ex) { e.Result = new object[] { ex, e.Argument }; } }
private void StreamViewer_StartControl(object sender, SourceControlTypeEventArgs e) { StreamViewerControl svc = sender as StreamViewerControl; if (svc == null) { return; } IControlPalette p = null; switch (e.ControlType) { case SourceControlTypes.PTZ: p = new PTZPalette(); break; case SourceControlTypes.Microwave: p = new MicrowavePalette(); break; default: return; } svc.Active = true; p.StreamViewerControl = svc; if (!PaletteWorker.IsBusy) { PaletteWorker.RunWorkerAsync(p); } else { FCMessageBox.Show("Please wait", "Another peripheral control is in the process of starting." + Environment.NewLine + "Please wait for it to finish.", this); svc.ControlState[e.ControlType] = SourceControlTypeState.Inactive; } }
void paletteWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (this.InvokeRequired) { this.Invoke(new RunWorkerCompletedEventHandler(paletteWorker_RunWorkerCompleted), sender, e); return; } try { if (e.Error != null) { throw e.Error; } IControlPalette p = e.Result as IControlPalette; if (p != null) { CurrentPalette = p; if (p.StreamViewerControl.FullScreen) { Stream_FullScreenClicked(p.StreamViewerControl, new EventArgs()); } p.StreamViewerControl.Active = true; p.Closed += new EventHandler <SourceControlTypeEventArgs>(StreamViewer_StopControl); p.StreamViewerControl.ControlState[p.ControlType] = SourceControlTypeState.Active; } else { //try to unwind the error, but if it gets crazy, just throw it out object[] errorResult = (object[])e.Result; if (errorResult != null) { if (errorResult.Length == 2) { Exception error = (Exception)errorResult[0]; p = (IControlPalette)errorResult[1]; p.StreamViewerControl.ControlState[p.ControlType] = SourceControlTypeState.Inactive; string msg = error.Message; //get fault specific message if available string fcMsg = (error.InnerException != null) ? error.InnerException.GetFaultInnerDetailMessage() : ""; if (!string.IsNullOrEmpty(fcMsg)) { msg += Environment.NewLine + Environment.NewLine + fcMsg; } msg += Environment.NewLine + Environment.NewLine + "Message from:" + Environment.NewLine + p.StreamViewerControl.CurrentConnection.GetDescription(); FCMessageBox.Show("Cannot access " + p.ControlType.ToString() + " control", msg, this); ErrorLogger.DumpToDebug(error); } } } } catch (Exception ex) //something terrible has happened... { FCMessageBox.Show("Cannot access control", ex.Message, this); ErrorLogger.DumpToDebug(ex); } }