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那么这里就死锁了