예제 #1
0
        /// <summary>
        /// Push event to this stage. Work may run
        /// on callers thread, or a different one depending on
        /// the RunInCallerContext property
        /// </summary>
        /// <param name="callback">Callback</param>
        /// <param name="e">Event being queued</param>
        protected void PushEvent
            (StageWorkerCallback callback, StageEvent e)
        {
            if (Log.IsDebugEnabled)
            {
                Log.Debug("Pushing event, current Stage is ["
                          + this + "], e is [" + e + "]");
            }


            var swc = new StageWorkerContext(callback, e);

            if (StageThreadPool == null || RunInCallerContext ||
                e.RunSynchronous)
            {
                // run in caller context
                try { callback.Invoke(e); }
                catch (Exception ex)
                {
                    swc.Exception = ex;
                    FireStageEvent(new StageExceptionEvent(swc));
                }
            }
            else
            {
                // push context
                StageThreadPool.QueueWork(swc);
            }
        }
예제 #2
0
 /// <summary>
 /// Fires ExceptionCaught event
 /// </summary>
 /// <param name="ctx">The StageWorkerContext</param>
 private void OnException(StageWorkerContext ctx)
 {
     Log.Error("Caught exception in ThreadPool", ctx.Exception);
     if (ExceptionCaught == null)
     {
         return;
     }
     ExceptionCaught(this, ctx);
 }
예제 #3
0
 /// <summary>
 /// Queue work item to the pool. The work item
 /// will run right away if a thread is available
 /// other wise it will be queued. Exact semantics
 /// will depend on implementation
 /// </summary>
 /// <param name="context">the stage's worker
 /// execution context</param>
 public override void QueueWork(StageWorkerContext context)
 {
     SmartThreadPool.QueueWorkItem(StageWorkerThread, context);
 }
예제 #4
0
 /// <summary>
 /// Queue work item to the pool. The work item
 /// will run right away if a thread is available
 /// other wise it will be queued. Exact semantics
 /// will depend on implementation
 /// </summary>
 /// <param name="context">the stage's worker
 /// execution context</param>
 public abstract void QueueWork
     (StageWorkerContext context);
예제 #5
0
 /// <summary>
 /// Queue work item to the pool. The work item
 /// will run right away if a thread is available
 /// other wise it will be queued. Exact semantics
 /// will depend on implementation
 /// </summary>
 /// <param name="context">the stage's worker
 /// execution context</param>
 public override void QueueWork(StageWorkerContext context)
 {
     ThreadPoolUtil.QueueUserWorkItem(StageWorkerThread, context);
 }