我想用c#写一个程序,程序中存在一个timer,每隔固定时间,timer就会触发,检查另一个进程proc1是否在运行,如果进程proc1没有运行就启动这个进程。    目前,每当timer触发时,程序就会生成一个新的线程,我使用mutex的 WaitOne 控制线程,但是产生了许多个等待的线程。 
    而我的目的是,当线程检查到进程proc1正在运行后,可以直接返回,而不是一直等待下去。
    
    不知道有没有什么好方法解决我的问题??

解决方案 »

  1.   

    using System.Threading;
    public delegate void Show();
    private Thread FThreadNoticeInfo;
    private Mutex FMutex;
    public event Show onShow;
            public Frm102(CDBOperator dbobj, bool dbobj4)
            {
                //
                // Windows 窗体设计器支持所必需的
                //
                InitializeComponent();
                //
                // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
                //
                FDBOperator = dbobj;
                IsLoginCTI = dbobj4;
                FMutex = new Mutex();
                this.onShow += new Show(onShowDo);
                //this.onClear += new Show(onClearDo);
            }
    private void Frm102_Load(object sender, System.EventArgs e)
    {
                FThreadNoticeInfoDBOperator = new CDBOperator();
                FThreadNoticeInfo = new Thread(new System.Threading.ThreadStart(CheckLatestNoticeInfo));
                FThreadNoticeInfo.Start();
    }
    public void StopCheckLatestNoticeInfoThread()
    {
                FThreadNoticeInfo.Abort();
                FThreadNoticeInfoDBOperator.Free();
    }
    private void CheckLatestNoticeInfo()
    {
                while (true)
                {
                    
                    Thread.Sleep(3000);
                    FMutex.WaitOne();
                    try
                    {
                        Invoke(onShow, null);
                    }
                    finally
                    {
                        FMutex.ReleaseMutex();
                    }
                }
    } void onShowDo()
    {
       检查到进程proc1正在运行后
       return;
    }
      

  2.   

    没太明白,你用mutex的 WaitOne 控制线程可以啊...只要在适当的时候releseMutex即可...没能完全理解你的意思,难否把问题说得更清楚点啊?
      

  3.   

    用Thread.Sleep()来定时,这样开一个线程就可以了
      

  4.   

    确实没懂。把"mutex的 WaitOne 控制线程"的这些去掉直接返回不就行了?
      

  5.   

    谢谢支持。我遇到的问题是这样的:计时器设置的时间间隔到达时,总是会启动相关处理函数,启动一个新的线程。 
    这些线程需要竞争同一个资源,如果不能获取这个资源则直接返回。
    C#中Mutex提供的WaitOne方法会使线程处于等待状态,而我的情况是,线程不需要等待,直接退出就可以了。
      

  6.   

    楼主的意思大致明白了,用waitOne方法也可以的,你可以设置一个等待时间,可以看下msdn..public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
    )参数
    millisecondsTimeout
    等待的毫秒数,或为 Timeout.Infinite (-1),表示无限期等待。 exitContext
    为 true,则等待之前先退出上下文的同步域(如果在同步上下文中),然后在稍后重新获取它;否则为 false。 返回值
    如果当前实例收到信号,则为 true;否则为 false。 看下这个吧...就是比你的waitone多两个参数...
      

  7.   

    不一定非用mutex , 还有别的
    ex
     Monitor.TryEnter
      

  8.   

    同意hdt(倦怠)。
    进程内,建议用Monitor以获得更好性能。若要用Mutex,参照liujia_0421()说的就差不多了。