我想用c#写一个程序,程序中存在一个timer,每隔固定时间,timer就会触发,检查另一个进程proc1是否在运行,如果进程proc1没有运行就启动这个进程。 目前,每当timer触发时,程序就会生成一个新的线程,我使用mutex的 WaitOne 控制线程,但是产生了许多个等待的线程。
而我的目的是,当线程检查到进程proc1正在运行后,可以直接返回,而不是一直等待下去。
不知道有没有什么好方法解决我的问题??
而我的目的是,当线程检查到进程proc1正在运行后,可以直接返回,而不是一直等待下去。
不知道有没有什么好方法解决我的问题??
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;
}
这些线程需要竞争同一个资源,如果不能获取这个资源则直接返回。
C#中Mutex提供的WaitOne方法会使线程处于等待状态,而我的情况是,线程不需要等待,直接退出就可以了。
int millisecondsTimeout,
bool exitContext
)参数
millisecondsTimeout
等待的毫秒数,或为 Timeout.Infinite (-1),表示无限期等待。 exitContext
为 true,则等待之前先退出上下文的同步域(如果在同步上下文中),然后在稍后重新获取它;否则为 false。 返回值
如果当前实例收到信号,则为 true;否则为 false。 看下这个吧...就是比你的waitone多两个参数...
ex
Monitor.TryEnter
进程内,建议用Monitor以获得更好性能。若要用Mutex,参照liujia_0421()说的就差不多了。