我想使用Timer每10秒扫描一次队列。如果此队列中有多于0个项目,则Deque第一个项目,将其作为参数传递给Process并运行该过程。执行此过程时应禁用计时器。一旦进程退出,它应该重新启用计时器。
队列中的项目可以手动添加,也可以来自数据库。
第一个进程完成后,以下C#代码不起作用。由于某种原因,计时器未再次启用。有人可以帮忙吗?
public MainForm()
{
InitializeComponent();
queue = new Queue<string>();
process = new Process();
process.Exited += new EventHandler(Process_Exited);
process.EnableRaisingEvents = true;
}
void StartProcess(string args)
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\My Software\RunProcess.exe";
psi.Arguments = args;
psi.WindowStyle = ProcessWindowStyle.Minimized;
process.StartInfo = psi;
process.Start();
}
void Process_Exited(object sender, EventArgs e)
{
timer.Enabled = true;
}
void Timer_Tick(object sender, EventArgs e)
{
if (queue.Count > 0)
{
timer.Enabled = false;
StartProcess(queue.Dequeue());
}
}
答案 0 :(得分:1)
由于时间不够,我没有查看详细信息,但我发现将timer.Enabled = true;
发送到UI线程可以解决问题。
编辑:刚刚检查过MSDN:“此Windows计时器专为使用UI线程执行处理的单线程环境而设计。它要求用户代码具有可用的UI消息泵,并始终在相同的线程,或将调用编组到另一个线程上。“
答案 1 :(得分:0)
考虑使用 Process.WaitForExit()而不是处理Exited事件。这样,您可以设置超时值(如果进程永不退出),您可以从Timer_Tick()方法中启动/停止计时器。
答案 2 :(得分:0)
祝你好运:
timer.AutoReset = true;