public partial class Form1 : Form
    {
        TestControl testControl = null;        public Form1()
        {
            InitializeComponent();
            testControl = new TestControl();
        }        private void Form1_Load(object sender, EventArgs e)
        {
            testControl.ProcessStart();
        }
    }   public class TestControl
    {
       private Thread _threadProcess = null;
       private ManualResetEvent _finishedEvent = null;       public TestControl()
       {
           _threadProcess = new Thread(ThreadProcess);
           _finishedEvent = new ManualResetEvent(false);     
       }       private void TestMethod()
       {
           Thread.Sleep(2000); //模拟处理事情
           _finishedEvent.Set();
       }       private void ThreadProcess()
       {
           Tools.LogWrite("Start..." + DateTime.Now.ToString("HH:mm:ss")); //写日志           _finishedEvent.Reset();
           TestMethod();
          _finishedEvent.WaitOne(); //win7,win2003(sp2)均正常
         // _finishedEvent.WaitOne(120000); 在win7下正常,在win2003(sp2)导致ThreadProcess()没有执行。           Tools.LogWrite("end..." + DateTime.Now.ToString("HH:mm:ss")); //写日志
       }       public void ProcessStart()
       {          
           _threadProcess.Start();
       }
    }
如上述代码,在win7或win2003(sp2)下执行,将输出类似这样的日志:
2013-01-28 14:38:01
Start...14:38:012013-01-28 14:38:03
end...14:38:03
与预期的一样。
但是当把finishedEvent.WaitOne();改为_finishedEvent.WaitOne(120000);后,
在win7仍正常,但在win2003(sp2)下,发现ThreadProcess()没有被执行,表现为没有输出任何日志。
但是threadProcess的状态是Running的。
请问是怎么回事。谢谢!

解决方案 »

  1.   

    对了,以上是用vs.net2005(简体中文 Team Suite版本)编译的。
      

  2.   

    代码有点怪:
    首先你把
     _finishedEvent = new ManualResetEvent(false); Event设为无信号
    接着你又用
         _finishedEvent.Reset();//设为无信号
         TestMethod();//设为有信号
        _finishedEvent.WaitOne();//等待
    这样子没有多少意义得。
      

  3.   


        public class TestControl
        {
            private Thread _threadProcess = null;
            private ManualResetEvent _finishedEvent = null;        public TestControl()
            {
                _threadProcess = new Thread(ThreadProcess);
                _finishedEvent = new ManualResetEvent(false);
            }        private void Work(Object state)
            {
                Thread.Sleep(2000);
                Tools.LogWrite("Work..." + DateTime.Now.ToString("HH:mm:ss"));
                _finishedEvent.Set();
            }        private void ThreadProcess()
            {
                for (int i = 0; i < 2; i++)
                {
                    Tools.LogWrite("Start..." + DateTime.Now.ToString("HH:mm:ss"));                _finishedEvent.Reset();
                    ThreadPool.QueueUserWorkItem(Work);
                    // _finishedEvent.WaitOne();    //win7与win2003(sp2)下,均正常输出日志。
                    _finishedEvent.WaitOne(120000); //在win7下正常,但在win2003(sp2)下,ThreadProcess()没有执行,没输出日志。                Tools.LogWrite("end..." + DateTime.Now.ToString("HH:mm:ss"));
                }
            }        public void ProcessStart()
            {
                _threadProcess.Start();
            }
        }完整的需求大概如上(还是省了一些不相关的东西).大家可以测下的。
      

  4.   

    貌似的确没啥问题,但就这段代码而言,你那eventwaithandle是没有意义的。
      

  5.   

    有意义啊,这个确保Work()完成后,才继续下一个循环。
      

  6.   

    你这样用线程池没意义啊,和在主线程上执行work有什么区别么?