public void Post(SendOrPostCallback callback, object state) { #region Contracts if (callback == null) throw new ArgumentNullException(); #endregion // Create Action action = delegate() { try { callback(state); } catch (Exception ex) { Debug.Fail(string.Format("Delegate:{0}, State:{1}, Message:{2}", callback.GetType(), "Exception", ex.Message)); } }; // Set lock (_syncRoot) { // Require if (_operateState != OperateState.Started) throw new InvalidOperationException(); if (_executeThreadState != OperateState.Started) throw new InvalidOperationException(); // Attach _executeActionQueue.Enqueue(action); } }
public void Send(SendOrPostCallback callback, object state) { #region Contracts if (callback == null) throw new ArgumentNullException(); #endregion // Create ManualResetEvent actionEvent = new ManualResetEvent(false); Action action = delegate() { try { callback(state); } catch (Exception ex) { Debug.Fail(string.Format("Delegate:{0}, State:{1}, Message:{2}", callback.GetType(), "Exception", ex.Message)); } finally { actionEvent.Set(); } }; // Set bool nowExecuteAction = true; lock (_syncRoot) { // Require if (_operateState != OperateState.Started) throw new InvalidOperationException(); if (_executeThreadState != OperateState.Started) throw new InvalidOperationException(); // Attach if (Thread.CurrentThread != _executeThread) { _executeActionQueue.Enqueue(action); nowExecuteAction = false; } } // Execute if (nowExecuteAction == true) { action(); } // Wait actionEvent.WaitOne(); }