当前位置: 代码迷 >> C# >> c# AutoResetEvent 循环暂停 主界面卡死解决思路
  详细解决方案

c# AutoResetEvent 循环暂停 主界面卡死解决思路

热度:357   发布时间:2016-05-05 05:34:54.0
c# AutoResetEvent 循环暂停 主界面卡死
        AutoResetEvent eventPauseRequired = new AutoResetEvent(false);
        AutoResetEvent eventResumeRequired = new AutoResetEvent(false);
        //执行操作
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dt_main.Rows.Count; i++)
            {
                if (eventPauseRequired.WaitOne(0))
                {
                    eventResumeRequired.WaitOne();
                }
                else
                {
                 ..............................
                 eventPauseRequired.Set();
               }
         }
以上是要执行的操作
======================================================
以下是接收外部程序发来的信息,收到信息则继续以上的操作
        public const int USER = 0x0400;
        public const int WM_CMM = USER + 10000;

        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_CMM: //处理消息
                    if (m.WParam.ToInt32() == 0)
                    {
                        eventResumeRequired.Set();
                    }
                    break;
                default:
                    base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
                    break;
            }
        }

============================================
i=0执行完毕就卡死,求教各位。多谢!
------解决思路----------------------
这都是在UI线程执行的,已经阻塞了,就无法处理消息,也就一直是阻塞状态。
不要阻塞UI线程,应该在其它线程处理实际任务,UI线程通过event来控制任务。
------解决思路----------------------
初始化的时候,两个参数都是false,那等任何一下都会卡死.
一般是用于多个线程之间的协调,楼主这些代码明显是在同一个线程即UI线程,不需要用得如此费劲.
------解决思路----------------------
没有什么“更简单有效的处理方式”,除非你从设计思路上就能想通。

既然你“阻塞”,自然就是“卡死”,这个结果是自己招来的。从一开始,不用太动脑筋就应该知道这样的“伪多线程程序”程序肯定会有这种结果。要做到“接收外部程序发来的信息,收到信息则继续以上的操作”,应该异步处理“后续操作”。

不要写代码,先画一个流程图(或者时序图),看看你是否能够正确地画出异步操作的设计图来。如果不能,先从这里的逻辑流程设计着手,不要急于写什么代码。
------解决思路----------------------
没看出来要做什么,
 eventResumeRequired.WaitOne();  一直在等,
没人reset();

------解决思路----------------------
执行到
eventResumeRequired.WaitOne();
时主线程被阻塞,消息循环无法处理新的消息,如果没有其他线程去Set那么这里就死锁了