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的。
请问是怎么回事。谢谢!
首先你把
_finishedEvent = new ManualResetEvent(false); Event设为无信号
接着你又用
_finishedEvent.Reset();//设为无信号
TestMethod();//设为有信号
_finishedEvent.WaitOne();//等待
这样子没有多少意义得。
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();
}
}完整的需求大概如上(还是省了一些不相关的东西).大家可以测下的。