// AsyncDispatchBehaviour
        /// <summary>
        /// 
        /// </summary>
        /// <param name="task"></param>
        /// <param name="prior"></param>
        /// <param name="channel"></param>
        /// <returns></returns>
        public Errno dispatch(AsyncTask task, sbyte prior, sbyte channel)
        {
            Errno err = (task != null && task.onHandleTask != null) ? Errno.OK : Errno.InvalidArg;

            if (err == Errno.OK)
            {
                task.setPrior(prior);
                task.setChannel(channel);

                int i = 0;

                Monitor.Enter(_taskQueue);  //++

                for (i = _taskQueue.Count - 1; i >= 0; --i)
                {
                    if (prior >= _taskQueue[i].getPrior())
                        break;
                }

                if (i < _taskQueue.Count - 1)
                    _taskQueue.Insert(i + 1, task);
                else
                    _taskQueue.Add(task);

                Monitor.Exit(_taskQueue);  //--

                wakeupWorker();
            }

            Debug.Assert(err == Errno.OK);
            return err;
        }
 public Errno dispatch(AsyncTask task, sbyte prior)
 {
     return dispatch(task, prior, 0);
 }
 public Errno dispatch(AsyncTask task)
 {
     return dispatch(task, 0, 0);
 }
        public int cancelTask(AsyncTask task)
        {
            int cancelNum = 0;

            if (task != null)
            {
                AsyncTask existTask = null;

                // search task queue
                if (_taskQueue.Count > 0)
                {
                    Monitor.Enter(_taskQueue);  //++

                    for (int i = _taskQueue.Count - 1; i >= 0; --i)
                    {
                        existTask = _taskQueue[i];

                        if (existTask == task)
                        {
                            _taskQueue.RemoveAt(i);
                            ++cancelNum;
                            break;
                        }
                    }  // for

                    Monitor.Exit(_taskQueue);  //--
                }

                if (cancelNum <= 0)
                {
                    // search current task
                    AsyncWorker worker = null;
                    for (int i = 0; i < _workerPool.Count; ++i)
                    {
                        worker = _workerPool[i];

                        Monitor.Enter(worker);  //++

                        existTask = worker.getCurrentTask();
                        if (existTask != null && existTask == task)
                        {
                            worker.cancelCurrentTask();
                            Monitor.Exit(worker);  //--

                            ++cancelNum;
                            break;
                        }

                        Monitor.Exit(worker);  //--
                    }
                }

                if (cancelNum <= 0)
                {
                    // search response queue
                    Monitor.Enter(_responseQueue);  //++

                    for (int i = _responseQueue.Count - 1; i >= 0; --i)
                    {
                        existTask = _responseQueue[i];

                        if (existTask == task)
                        {
                            _responseQueue.RemoveAt(i);
                            ++cancelNum;
                            break;
                        }
                    }  // for

                    Monitor.Exit(_responseQueue);  //--
                }
            }

            return cancelNum;
        }
Example #5
0
        private void processTasks()
        {
            bool isExit = false;
            AsyncTask task = null;
            IDictionary<int, object> resultDict = null;

            IList<AsyncTask> responseQueue = _dispatcher.getResponseQueue();

            while (true)
            {
                Monitor.Enter(this);  // ++

                switch (this.status)
                {
                    case Status.Dying:
                        Monitor.Exit(this);  // --
                        isExit = true;
                        break;
                    default:
                        break;
                }

                if (isExit)
                    break;

                task = _dispatcher.popTask();

                if (task != null)
                {
                    _curTask = task;
                    Monitor.Exit(this);  // --

                    resultDict = new Dictionary<int, object>();
                    task.errorCode = task.onHandleTask(task, resultDict);

                    Monitor.Enter(this);  // ++
                    if (_curTask != null && task.onCompleteTask != null)
                    {
                        task.resultDict = resultDict;

                        Monitor.Enter(responseQueue);  // ++1

                        /*
                        if (responseQueue.Count > 0)
                            responseQueue.Insert(0, task);
                        else
                        //*/
                            responseQueue.Add(task);

                        Monitor.Exit(responseQueue);  // --1
                    }

                    _curTask = null;
                    Monitor.Exit(this);  // --

                    task = null;
                    resultDict = null;
                }
                else
                {
                    this.status = Status.WaitingTask;
                    _idleTimestamp = DateTime.UtcNow;

                    Monitor.Wait(this);  //wait

                    switch (this.status)
                    {
                        case Status.Dying:
                            isExit = true;
                            break;
                        default:
                            break;
                    }

                    Monitor.Exit(this);  // --
                }

                if (isExit)
                    break;

            }  // while

            return;
        }
Example #6
0
 internal void cancelCurrentTask()
 {
     _curTask = null;  // g.s.c
 }