今日做了一个简单试验,用互斥类Mutex作进程间的互斥,先建立一个窗体级别的互斥类My_mutex,
其中有几个按纽
private void button1_Click(object sender, EventArgs e)
{
  My_mutex.WaitOne();
}
private void button2_Click(object sender, EventArgs e)
{
  this.timer1.Enabled=true;
}
private void button3_Click(object sender, EventArgs e)
{
  try
  {
    My_mutex.ReleaseMutex();
  }catch{}
}
即进入互斥状态,
之后在一个1秒钟执行一次的时钟timer1_Tick执行事件如下:
private void timer1_Tick(object sender, EventArgs e)
{
  bool TemResult=false;
  TemResult=My_mutex.WaitOne(5000, false);
  if(TemResult==false)
  {
     //MessageBox.Show("等待已经超时了!!");
     this.timer1.Enabled=false;
  }else
  {
     this.listBox1.Items.Add("你好");
  }
  try
  {
     My_mutex.ReleaseMutex();
  }catch{}
}
以上大概是令每次时钟执行一次就进行一个互斥操作,超时时间为5秒钟,于是我运行了该程序的两个实例,先在第一实例窗口中按了一下button1即
进行无限等待的互斥操作My_mutex.WaitOne(); 之后在第二实例窗口中按了
一下button2,即 令时钟进入计时状态,之后查看结果:
1、如果什么也不做之后在5秒钟后,时钟停止,没有任何信息加入列表listBox1,
2、如果在5秒的互斥超时等待时间之内按一下实例1窗口的button3,即释放上一个互斥,
   这样实例2理科就会有n个信息加入列表,
   n=时钟执行次数,如此可以得结论就是,在互斥期间,时钟事件还是会被触发,并
   不象我期待那样以为凡是有互斥等待,时钟也会被冻结,但事实上是时钟
   不受互斥对象等待超时的影响,如果互斥对象在超时事件内得到进入,期间的时钟
   事件代码也会全部执行,当然互斥对象等待超时,代码不会执行。
3、我认为C#的时钟组件还是用了消息队列来工作。以上是试验的结果,欢迎拍砖!

解决方案 »

  1.   

    没人告诉你Mutex是跨进程的。你要快进程那么需要命名的Mutex
      

  2.   

    是的,我已经声明了夸进程的mutex了
    My_mutex = new Mutex(false, "mytest");
      

  3.   

    My_mutex.WaitOne(5000, false);
    这一句是个废话,根本不会等待5秒钟,同一个线程内的互斥体即使重复获取也不会阻塞!C#的计时器有三种,一个是forms名称空间的,另外一个是threading里面的,还有一个timer名称空间的,不一样的。forms里面的用消息队列的。
      

  4.   

    My_mutex.WaitOne(5000, false);
    这一句是个废话,根本不会等待5秒钟,同一个线程内的互斥体即使重复获取也不会阻塞!什么废话,你没看到上面我是用两个程序实例吗?
    那边的实例首先进入互斥,这边这句话绝对可以等待5秒,这并不是在同一进程中的主线程试验的。
      

  5.   

    看完片子回来,细细看了lz的描述。。lz以为WaitOne(5000, false);一定会等待5秒。呵呵,好好看看msdn
      

  6.   

    楼上两位,不知道你们按我的做法试了了没有,为何说WaitOne(5000, false);这句就无效了呢,
    我是经过实际测试了的,无论是5秒还是10秒结果都一样可以阻塞,可能楼上没看清楚我运行
    的是两个实例,即一个程序运行两次,两个实例之间的测试。
    多说罗嗦,结了。