示例#1
0
文件: DEThread.cs 项目: s72785/des
        }         // proc Dispose

        #endregion

        #region -- Execute ----------------------------------------------------------------

        private void Execute()
        {
            var lastExceptionTick = 0;            // Wann wurde die Letzte Exeption abgefangen
            var exceptionCount    = 0;            // Wieviele wurde im letzten Zeitfenster gefangen

            // mark start of the thread
            log.Start(thread.Name);
            RegisterThread(this);
            try
            {
                startedEvent?.Set();
                do
                {
                    try
                    {
                        ExecuteLoop();
                    }
                    catch (ThreadAbortException)
                    {
                        log.Abort(Thread.CurrentThread.Name);
                        if (propertyRunning != null)
                        {
                            propertyRunning.Value = "Abgebrochen";
                        }
                        UnregisterThread();
                        return;
                    }
                    catch (Exception e)
                    {
                        if (!OnHandleException(e))
                        {
                            if (unchecked (Environment.TickCount - lastExceptionTick) > 500)
                            {
                                exceptionCount = 0;
                            }

                            lastExceptionTick = Environment.TickCount;
                            exceptionCount++;

                            if (exceptionCount > 3)
                            {
                                propertyRunning.Value = "Fehlerhaft";
                                Thread.CurrentThread.Abort();                                 // mehr als 3 Exeption in 1500 ms ist fatal
                            }
                            else
                            {
                                log.LogMsg(LogMsgType.Error,
                                           String.Format("Thread '{0}' neugestartet: {1}" + Environment.NewLine + Environment.NewLine +
                                                         "{2}", thread.Name, exceptionCount, e.GetMessageString()));
                                Thread.Sleep(100);
                            }
                        }
                        else
                        {
                            exceptionCount = 0;
                        }

                        propertyRestarts.Value += 1;
                    }
                } while (IsRunning);

                // stop the thread
                log.Stop(thread.Name);
                propertyRunning.Value = "Beendet";
                UnregisterThread(this);
            }
            catch (ThreadAbortException)
            {
                UnregisterThread(this);
            }
        }         // proc Execute