C# 时间等待内法

C# 时间等待内法,c#,.net,multithreading,timer,while-loop,C#,.net,Multithreading,Timer,While Loop,我从来没有在定时器和延迟方面做过太多的工作,所以我很确定我的代码做了一些非常糟糕的事情,但我想不出一个解决方案 好的。。。我有一个叫做AnimatorsPool的类,它一次包含并处理许多Animator类。Animator只是一个简单的、基于计时器的控制移动器 public sealed class AnimatorsPool : IDisposable { private Boolean m_Disposed; private Boolean m

我从来没有在定时器和延迟方面做过太多的工作,所以我很确定我的代码做了一些非常糟糕的事情,但我想不出一个解决方案

好的。。。我有一个叫做AnimatorsPool的类,它一次包含并处理许多Animator类。Animator只是一个简单的、基于计时器的控制移动器

    public sealed class AnimatorsPool : IDisposable
    {
        private Boolean m_Disposed;
        private Boolean m_Stopped;
        private Boolean m_Waiting;
        private Int32 m_DelayBetween;
        private Int32 m_DelayStart;
        private List<Animator> m_Animators;
        private Stopwatch m_Stopwatch;

        public Boolean AnimationsFinished
        {
            get
            {
                foreach (Animator animator in m_Animators)
                {
                    if (!animator.AnimationFinished)
                        return false;
                }

                return true;
            }
        }

        public AnimatorsPool(Int32 delayBetween, Int32 delayStart)
        {
            m_Disposed = false;
            m_Stopped = false;
            m_Waiting = false;
            m_DelayBetween = ((delayBetween < 0) ? 0 : delayBetween);
            m_DelayStart = ((delayStart < 0) ? 0 : delayStart);
            m_Animators = new List<Animator>();
        }

        private void Wait(Int32 delay)
        {
            m_Stopwatch = Stopwatch.StartNew();

            m_Waiting = true;

            while (!m_Stopped && (m_Stopwatch.ElapsedMilliseconds <= delay))
                Application.DoEvents();

            m_Waiting = false;

            m_Stopwatch.Stop();
        }

        public void Add(Animator animator)
        {
            m_Animators.Add(animator);
        }

        public void Dispose()
        {
            if (!m_Disposed)
            {
                foreach (Animator animator in m_Animators)
                    animator.Dispose();

                m_Animators.Clear();
                m_Animators = null;

                m_Disposed = true;
            }

            GC.SuppressFinalize(this);
        }

        public void Start()
        {
            if (m_Animators.Count > 0)
            {
                if (m_DelayStart > 0)
                    Wait(m_DelayStart);

                m_Animators[0].Start();

                if (m_Animators.Count > 1)
                {
                    for (Int32 i = 1, length = m_Animators.Count; i < length; ++i)
                    {
                        if (m_DelayBetween > 0)
                            Wait(m_DelayBetween);

                        m_Animators[i].Start();
                    }
                }
            }
        }

        public void Stop()
        {
            m_Stopped = true;

            while (m_Waiting)
                Application.DoEvents();
        }
    }
好了,现在。。。一开始发生的事情是,如果我在AnimatorsPool仍在运行Wait()方法时退出程序,我的主窗体将消失,但进程仍在我的任务管理器中不间断地运行。 因此,我在主窗体中实现了Dispose覆盖:

    protected override void Dispose(Boolean disposing)
    {
        if (!m_Disposed)
        {
            if (disposing)
            {
                s_RandomProvider.Dispose();

                foreach (AnimatorsPool pool in m_AnimatorsPools)
                    pool.Dispose();

                m_AnimatorsPools.Clear();
                m_AnimatorsPools = null;
            }

            m_Disposed = true;
        }

        base.Dispose(disposing);
    }
好的。。。现在,我的程序有时会正确退出,但有时不会。从debug中我可以看到,当它发生时,这是因为一些AnimatorsPool仍然在运行Wait()方法,即使m_Stopped设置为true。
我想我应该使用线程、计时器或类似的东西,但我没有经验。欢迎任何帮助!谢谢

无论你做什么,都不要这样做:

while (!m_Stopped && (m_Stopwatch.ElapsedMilliseconds <= delay))
    Application.DoEvents();

while(!m_Stopped&&(m_Stopwatch.elapsedmillesons)我应该拆分我的启动方法,以便使用两个计时器,并编辑“滴答”事件以添加更多信息。
while (!m_Stopped && (m_Stopwatch.ElapsedMilliseconds <= delay))
    Application.DoEvents();