Ejemplo n.º 1
0
        private void run()
        {
START:
            DbConnection connection = null;

            do
            {
                while (System.Threading.Interlocked.CompareExchange(ref queueLock, 1, 0) != 0)
                {
                    AutoCSer.Threading.ThreadYield.Yield(AutoCSer.Threading.ThreadYield.Type.SqlLinkQueueTaskPop);
                }
                LinkQueueTaskNode value = head;
                head      = end = null;
                queueLock = 0;
                if (value == null)
                {
                    System.Threading.Thread.Sleep(0);
                    while (System.Threading.Interlocked.CompareExchange(ref queueLock, 1, 0) != 0)
                    {
                        AutoCSer.Threading.ThreadYield.Yield(AutoCSer.Threading.ThreadYield.Type.SqlLinkQueueTaskPop);
                    }
                    value     = head;
                    head      = end = null;
                    queueLock = 0;
                    if (value == null)
                    {
                        client.FreeConnection(ref connection);
                        //isThread = 0;
                        System.Threading.Interlocked.Exchange(ref isThread, 0);
                        if (head != null && System.Threading.Interlocked.CompareExchange(ref isThread, 1, 0) == 0)
                        {
                            goto START;
                        }
                        return;
                    }
                }
                do
                {
                    try
                    {
                        do
                        {
                            value = value.RunLinkQueueTask(ref connection);
                        }while (value != null);
                        break;
                    }
                    catch (Exception error)
                    {
                        client.CloseErrorConnection(ref connection);
                        AutoCSer.Log.Pub.Log.Add(Log.LogType.Error, error);
                    }
                    LinkQueueTaskNode next = value.LinkNext;
                    value.LinkNext = null;
                    value          = next;
                }while (value != null);
            }while (true);
        }
Ejemplo n.º 2
0
        private void run()
        {
START:
            DbConnection connection = null;

            do
            {
                queueLock.EnterYield();
                LinkQueueTaskNode value = head;
                head = end = null;
                queueLock.Exit();
                if (value == null)
                {
                    System.Threading.Thread.Sleep(0);
                    queueLock.EnterYield();
                    value = head;
                    head  = end = null;
                    queueLock.Exit();
                    if (value == null)
                    {
                        client.FreeConnection(ref connection);
                        //isThread = 0;
                        System.Threading.Interlocked.Exchange(ref isThread, 0);
                        if (head != null && System.Threading.Interlocked.CompareExchange(ref isThread, 1, 0) == 0)
                        {
                            goto START;
                        }
                        return;
                    }
                }
                do
                {
                    try
                    {
                        do
                        {
                            value.RunLinkQueueTask(ref connection, ref value);
                        }while (value != null);
                        break;
                    }
                    catch (Exception error)
                    {
                        client.ResetErrorConnection(ref connection);
                        AutoCSer.LogHelper.Exception(error, null, LogLevel.Exception | LogLevel.AutoCSer);
                    }
                }while (value != null);
            }while (true);
        }