进程队列计时器

时间:2010-08-23 07:40:15

标签: c# process timer queue

我想使用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());
    }
}

3 个答案:

答案 0 :(得分:1)

由于时间不够,我没有查看详细信息,但我发现将timer.Enabled = true;发送到UI线程可以解决问题。

编辑:刚刚检查过MSDN:“此Windows计时器专为使用UI线程执行处理的单线程环境而设计。它要求用户代码具有可用的UI消息泵,并始终在相同的线程,或将调用编组到另一个线程上。“

答案 1 :(得分:0)

考虑使用 Process.WaitForExit()而不是处理Exited事件。这样,您可以设置超时值(如果进程永不退出),您可以从Timer_Tick()方法中启动/停止计时器。

答案 2 :(得分:0)

祝你好运:

  

timer.AutoReset = true;