日期:2014-05-18  浏览次数:20975 次

一个最简单的线程问题
public class Alpha
  {
  public void Beta()
  {
  while (true)
  {
  Console.WriteLine("Alpha.Beta is running in its own thread.");
  }
  }
  }
  class Program
  {
  static void Main(string[] args)
  {
  Console.WriteLine("Thread Start/Stop/Join Sample");
  Alpha oAlpha = new Alpha();   
  Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
  oThread.Start();
  while (!oThread.IsAlive)
  Thread.Sleep(1);
  oThread.Suspend(); -----------------(1)挂起线程  
  oThread.Join(); -----------------(2)这是干什么? 不懂,希望能有高人解释。
  oThread.Resume(); -----------------(3)恢复现程,如果把这句话省略,程序不直停在这里,不能向下走,为什么??  
  Console.WriteLine("Alpha.Beta has finished"); 
  try
  {
  Console.WriteLine("Try to restart the Alpha.Beta thread");
  oThread.Resume(); -----------------(4)恢复现程,本来是想把(3)那里删除,在这里恢复线程,可是如果(3)那里取消,根本进不到这里来,为什么??
  }    
  catch (ThreadStateException) 
  {      
  Console.Write("ThreadStateException trying to restart Alpha.Beta. "); 
  Console.WriteLine("Expected since aborted threads cannot be restarted."); 
  Console.ReadLine();
  }  
  }  
  }

------解决方案--------------------
oThread.Join(); 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止
Main函数执行到这的时候不会继续执行下一条语句,会等到oThread线程执行结束,Main才继续执行。
因为有oThread.Join();的存在,而且你线程函数是死循环不退出,所以后面的代码都不执行。

Thread.Sleep(1);将当前线程挂起指定的时间
单位1毫秒 不是1秒

但是这个时间是不准确的,Thread.Sleep(1);之后的语句执行时,时间差不一定是1毫秒,因为CPU轮询时间片是20毫秒左右,这个时间本身就不固定,也看系统当前的线程调度情况。如果没有把CPU分配给别的线程,那有1毫秒之后继续执行的可能。
------解决方案--------------------
探讨
Thread.Sleep(1);----这里的线程延时一秒,是主线程停止运行,把CPU时间让给oThread线程吗?

------解决方案--------------------
同步主线程的。
------解决方案--------------------
探讨

oThread.Join(); 在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止
Main函数执行到这的时候不会继续执行下一条语句,会等到oThread线程执行结束,Main才继续执行。
因为有oThread.Join();的存在,而且你线程函数是死循环不退出,所以后面的代码都不执行。

Thread.Sleep(1);将当前线程挂……

------解决方案--------------------
我只能这么说,有些代码debug不出来的

oThread.Suspend();被标识已过期
------解决方案--------------------
我调试了代码 有时候确实会停止,有时候不会。

“不要使用 Suspend 和 Resume 方法来同步线程的活动。 您无法知道挂起线程时它正在执行什么代码。如果您在安全权限评估期间挂起持有锁的线程,则 AppDomain 中的其他线程可能被阻止。 如果您在线程正在执行类构造函数时挂起它,则 AppDomain 中尝试使用该类的其他线程将被阻止。 这样很容易发生死锁。”

------解决方案--------------------
C# code

public void Beta()
  {
  while (true)
  {
  Console.WriteLine("Alpha.Beta is running in its own thread.");
  }
  }

------解决方案--------------------
探讨
在我的电脑上调试,每次都停止,从昨天到今天,都没有一次是运行下去的,呵呵。求大侠明示啊,