/// <summary> /// 添加任务 /// </summary> /// <param name="value"></param> public void Add(TaskQueueNode value) { if (value.LinkNext != null) { throw new InvalidOperationException(); } while (System.Threading.Interlocked.CompareExchange(ref queueLock, 1, 0) != 0) { AutoCSer.Threading.ThreadYield.YieldOnly(); } if (head == null) { end = value; head = value; System.Threading.Interlocked.Exchange(ref queueLock, 0); waitHandle.Set(); } else { end.LinkNext = value; end = value; System.Threading.Interlocked.Exchange(ref queueLock, 0); } }
/// <summary> /// TCP 服务器端同步调用任务处理 /// </summary> private void run() { do { waitHandle.Wait(); while (System.Threading.Interlocked.CompareExchange(ref queueLock, 1, 0) != 0) { AutoCSer.Threading.ThreadYield.YieldOnly(); } TaskQueueNode value = head; end = null; head = null; System.Threading.Interlocked.Exchange(ref queueLock, 0); if (isDisposed) { return; } while (value != null) { try { do { value.RunTask(); if (isDisposed) { return; } value = value.LinkNext; }while (value != null); break; } catch (Exception error) { AutoCSer.Log.Pub.Log.Add(Log.LogType.Error, error); } if (isDisposed) { return; } value = value.LinkNext; } }while (!isDisposed); }
internal void RunTask(ref TaskQueueNode next) { next = LinkNext; LinkNext = null; RunTask(); }