Beispiel #1
0
        /// <summary>
        /// 运行线程
        /// </summary>
        private void run()
        {
            action             task, domainUnload;
            action <Exception> onError;

            Monitor.Enter(threadLock);
            try
            {
                if (this.task == null)
                {
                    Monitor.Wait(threadLock);
                }
                task              = this.task;
                domainUnload      = this.domainUnload;
                onError           = this.onError;
                this.task         = null;
                this.domainUnload = null;
                this.onError      = null;
            }
            finally { Monitor.Exit(threadLock); }
            while (!isStop)
            {
                if (domainUnload != null)
                {
                    fastCSharp.domainUnload.Add(domainUnload);
                }
                try
                {
                    task();
                }
                catch (Exception error)
                {
                    if (onError != null)
                    {
                        try
                        {
                            onError(error);
                        }
                        catch (Exception error1)
                        {
                            log.Default.Add(error1, null, false);
                        }
                    }
                    else
                    {
                        log.Default.Add(error, null, false);
                    }
                }
                finally
                {
                    if (domainUnload != null)
                    {
                        fastCSharp.domainUnload.Remove(domainUnload, false);
                    }
                }
                threadPool.Push(this);
                Monitor.Enter(threadLock);
                try
                {
                    if (this.task == null)
                    {
                        Monitor.Wait(threadLock);
                    }
                    task              = this.task;
                    domainUnload      = this.domainUnload;
                    onError           = this.onError;
                    this.task         = null;
                    this.domainUnload = null;
                    this.onError      = null;
                }
                finally { Monitor.Exit(threadLock); }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 运行线程
        /// </summary>
        private void run()
        {
#pragma warning disable 618
#pragma warning disable 612
            if (DefaultFrameCount == 0)
            {
                DefaultFrameCount = new System.Diagnostics.StackTrace(threadHandle, false).FrameCount;
            }
#pragma warning restore 612
#pragma warning restore 618
            do
            {
                try
                {
                    do
                    {
                        if (domainUnload.Type == fastCSharp.domainUnload.unloadType.None)
                        {
                            task.Call();
                        }
                        else
                        {
                            fastCSharp.domainUnload.Add(ref domainUnload);
                            task.Call();
                            domainUnload.Type = fastCSharp.domainUnload.unloadType.None;
                            fastCSharp.domainUnload.Remove(ref domainUnload);
                        }
                        task.Value = null;
                        onError    = null;
                        threadPool.Push(this);
                        waitHandle.Wait();
                    }while (task.Type != callType.None);
                    threads.UnsafeFree(threadIndex);
                    return;
                }
                catch (Exception error)
                {
                    try
                    {
                        switch (onErrorType)
                        {
                        case errorType.Action: new unionType {
                                Value = onError
                        }.ActionException(error); break;

                        default: log.Error.Add(error, null, false); break;
                        }
                    }
                    catch (Exception error1)
                    {
                        log.Error.Add(error1, null, false);
                    }
                }
                finally
                {
                    task.Value = null;
                    onError    = null;
                    if (domainUnload.Type != fastCSharp.domainUnload.unloadType.None)
                    {
                        fastCSharp.domainUnload.Remove(ref domainUnload);
                    }
                }
                threadPool.Push(this);
                waitHandle.Wait();
            }while (task.Type != callType.None);
            //do
            //{
            //    if (domainUnload.Type != fastCSharp.domainUnload.unloadType.None) fastCSharp.domainUnload.Add(ref domainUnload);
            //    try
            //    {
            //        task.Call();
            //    }
            //    catch (Exception error)
            //    {
            //        try
            //        {
            //            switch (onErrorType)
            //            {
            //                case errorType.Action: new unionType { Value = onError }.ExceptionAction(error); break;
            //                default: log.Error.Add(error, null, false); break;
            //            }
            //        }
            //        catch (Exception error1)
            //        {
            //            log.Error.Add(error1, null, false);
            //        }
            //    }
            //    finally
            //    {
            //        task.Value = null;
            //        onError = null;
            //        if (domainUnload.Type != fastCSharp.domainUnload.unloadType.None) fastCSharp.domainUnload.Remove(ref domainUnload);
            //    }
            //    threadPool.Push(this);
            //    waitHandle.Wait();
            //}
            //while (task.Type != callType.None);
            threads.UnsafeFree(threadIndex);
        }