Ограничить время выполнения потока таймера - PullRequest
1 голос
/ 10 ноября 2011

Как я могу ограничить время выполнения потока таймера?У меня давно работает таймер, который должен работать не более 30 секунд.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Единственный способ сделать это состоит в том, чтобы второй поток (возможно, тот, который создал рабочий поток) отслеживал, а затем уничтожал его или грациозно вызывал его для немедленного выхода. Убийство потоков следует избегать, и использовать только в качестве крайней меры. Вот пример того, как:

        Thread t = new Thread(myLongThreadProc);
        t.Start();
        Thread.Sleep(30000);
        t.Abort();

Под «изящным вызовом для выхода» я имею в виду установить некоторую переменную остановки на какое-то значение и дать потоку некоторое время, чтобы выйти самому, иначе вы убьете его. Но это дизайн вашей функции потока, чтобы заставить ее фактически выйти. Вот пример кода:

        Thread t = new Thread(myLongThreadProc);
        threadRun = true;
        t.Start();
        Thread.Sleep(30000);
        threadRun = false; //this variable is monitored by thread
        if (!t.Join(1000))  //inside your thread, make sure it does quit in one second
        {                   //when this variable is set to false
            t.Abort();
        }

И должен ли я упомянуть, что потоку вызывающей стороны не нужно спать в течение 30 секунд, но вы можете вместо этого использовать таймер (если это поток формы) или сделать что-то полезное и периодически проверять - или просто иметь третий рабочий поток считая 30 секунд ...

0 голосов
/ 12 ноября 2011

Просто пусть ваш рабочий метод запускает 30-секундный таймер и проверяет, истек ли он, когда ваш рабочий делает свое дело:

    bool timerElapsed;

    public void DoWork()
    {
        timerElapsed=false;
        System.Timers.Timer timer = new System.Timers.Timer(30000);
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.Start();

        while (true)
        {
            if (timerElapsed)
            {
                // handle 30-sec elasped error
                break;
            }
            // continue doing work and break when done
        }
        timer.Stop();
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        timerElapsed = true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...