Таймер очереди процесса - PullRequest
       12

Таймер очереди процесса

0 голосов
/ 23 августа 2010

Я хочу сканировать очередь каждые 10 секунд, используя таймер. Если в этой очереди более 0 элементов, то удалите первый из них, передайте его в качестве аргумента процессу и запустите этот процесс. Таймер должен быть отключен во время выполнения этого процесса. После завершения процесса он должен снова включить таймер.

Элементы в очереди можно добавить вручную или из базы данных.

Следующий код 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 ]

1 голос
/ 23 августа 2010

Я не искал детали из-за нехватки времени, но обнаружил, что отправка timer.Enabled = true; в поток пользовательского интерфейса поможет.

РЕДАКТИРОВАТЬ: только что проверил MSDN: "Этот таймер Windows предназначен для однопоточной среды, где потоки пользовательского интерфейса используются для выполнения обработки. Он требует, чтобы пользовательский код имел доступ к насосу сообщений пользовательского интерфейса и всегдаработать из того же потока или перенаправить вызов в другой поток. "

0 голосов
/ 23 августа 2010

Любая удача с:

timer.AutoReset = true;

0 голосов
/ 23 августа 2010

Попробуйте использовать Process.WaitForExit () вместо обработки события Exited.Таким образом, вы можете установить значение тайм-аута (в случае, если процесс никогда не завершится), и вы можете запустить / остановить таймер из метода Timer_Tick ().

...