// 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; }
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; }
internal void cancelCurrentTask() { _curTask = null; // g.s.c }