2011-11-10 60 views
1

我怎樣才能限制計時器線程執行時間?我長時間運行定時器工作,應該不超過30秒。限制計時器線程執行時間

+0

你不能直接做到這一點 - 你有某種循環,你可以檢查t他流逝的時間,在線程本身? –

+0

不是重複,但相關:http://stackoverflow.com/questions/299198/implement-c-sharp-generic-timeout –

+0

@ShadowWizard我沒有在計時器線程循環,任何想法? – kseen

回答

1

做到這一點的唯一方法是讓第二個線程(可能創建工作線程的)監控,然後殺死它或優雅地調用它立即退出。殺死線程你應該避免,並且只能作爲最後的手段使用。下面是例子,如何:

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

通過「優雅地把它放棄」,我的意思是設置一些stop變量爲某個值,並給出了一些線索很短的時間退出本身,否則你殺了它。但它是你的線程函數的設計,使其實際上退出。下面是示例代碼:

 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

贊同反對殺死線程的觀點。 –

+0

無需爲此啓動一個單獨的線程。這是一個巨大的資源浪費。如果啓動後臺線程的線程要等待退出,爲什麼要啓動一個線程呢?最好使用一次性定時器,並讓回調函數指示另一個線程停止。 –

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; 
    } 
+0

爲什麼要使用一個計時器,當你可以只用'變種SW = Stopwatch.StartNew()',然後有你的迴路校驗'sw.ElapsedMilliseconds> 30000'? –

+0

@Mim米契爾 - 檢查經過的時間可以工作一樣好(順便說一句,你爲什麼不提供,作爲一個答案?)但是,如果OP的代碼很複雜,可能是簡單的貶謫經過檢查計時器。 –