关闭

改善C#程序的157个建议(连载72)

发表于:2011-11-09 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  这说明tWork开始在autoResetEvent上等待任何其他地方给它的信号。信号来了,则tWork开始继续工作,否则就一直等着(即阻滞)。接下来看看主线程中的这句代码(本例中即UI线程,它相对于线程tWork来说,就是一个“另外的线程”):

autoResetEvent.Set();

  主线程通过上面这句代码向在autoResetEvent上等待的线程tWork上下文发送信号,即将tWork的阻滞状态设置为true。tWork接收到这个信号后,开始继续工作。 这个例子相当简单,但是已经完整说明了信号机制的工作原理。 AutoResetEvent和ManualResetEvent的区别是:前者在发送信号完毕后(即调用Set方法),会自动将自己的阻滞状态设置为false,而后者则需要进行手动设定。通过一个例子来说明这种区别,如下所示:

  1. AutoResetEvent autoResetEvent = new AutoResetEvent(false);  
  2.  
  3. private void buttonStartAThread_Click(object sender, EventArgs e)  
  4. {  
  5.     StartThread1();  
  6.     StartThread2();  
  7. }  
  8.  
  9. private void StartThread1()  
  10. {  
  11.     Thread tWork1 = new Thread(() => 
  12.     {  
  13.         label1.Text = "线程1启动..." + Environment.NewLine;  
  14.         label1.Text += "开始处理一些实际的工作" + Environment.NewLine;  
  15.         //省略工作代码  
  16.         label1.Text += "我开始等待别的线程给我信号,才愿意继续下去" +   
  17.             Environment.NewLine;  
  18.         autoResetEvent.WaitOne();  
  19.         label1.Text += "我继续做一些工作,然后结束了!";  
  20.         //省略工作代码  
  21.     });  
  22.     tWork1.IsBackground = true;  
  23.     tWork1.Start();  
  24. }  
  25.  
  26. private void StartThread2()  
  27. {  
  28.     Thread tWork2 = new Thread(() => 
  29.     {  
  30.         label2.Text = "线程2启动..." + Environment.NewLine;  
  31.         label2.Text += "开始处理一些实际的工作" + Environment.NewLine;  
  32.         //省略工作代码  
  33.         label2.Text += "我开始等待别的线程给我信号,才愿意继续下去" +   
  34.              Environment.NewLine;  
  35.         autoResetEvent.WaitOne();  
  36.         label2.Text += "我继续做一些工作,然后结束了!";  
  37.         //省略工作代码  
  38.     });  
  39.     tWork2.IsBackground = true;  
  40.     tWork2.Start();  
  41. }  
  42.  
  43. private void buttonSet_Click(object sender, EventArgs e)  
  44. {  
  45.     //给在autoResetEvent上等待的线程一个信号  
  46.     autoResetEvent.Set();  
  47. }

  这个例子的本意是要让新起的两个工作线程tWork1和tWork2都阻滞,直到收到主线程的信号再继续工作。而程序运行的结果是,只有一个工作线程继续工作,另外一个工作线程则继续保持阻滞状态。我想可能大家都已经猜到原因了,即AutoResetEvent发送信号完毕就在内核中自动将自己的状态设置回false了,所以另外一个工作线程相当于根本没有收到主线程的信号。

32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号