Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
 internal void RunTask(ref TaskQueueNode next)
 {
     next     = LinkNext;
     LinkNext = null;
     RunTask();
 }