限制计时器线程执行时间

时间:2011-11-10 10:51:51

标签: c# .net multithreading timer timeout

如何限制计时器线程执行时间?我一直在运行计时器工作,工作时间不应超过30秒。

2 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是使用第二个线程(可能是创建工作线程的线程)监视器然后将其终止或优雅地调用它以立即退出。杀死您应该避免的线程,并且仅作为最后的手段使用。以下是示例:

        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秒......

答案 1 :(得分:0)

让你的工人方法启动一个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;
    }