2010-02-02 86 views
2

我有一個需要添加一個超長時間運行的線程。我們遇到了一些外部問題,有時會導致該線程無限期地掛在特定的代碼行上。爲了使我們的過程更健壯,我們希望檢測到線程不再主動運行/輪詢並中止線程。這將讓我們清理資源並重新啓動線程。手動計時一個C#線程

添加此功能的首選方法是?

回答

2

你需要兩樣東西:

  1. 其他某些線程,可以做監控和中止(你的「監控」線程)
  2. 一些機制來看看如果懷疑線程仍在工作

在最簡單的版本中,您的可疑線程以可靠的頻率更新當前時間的共享靜態變量。如何適合你的線程的控制流程取決於你(這是很難的部分 - 你通常會用另一個線程來做這種事情)。然後只需要喚醒第二個線程並經常檢查它。如果不是最近一次,請中止該線程。

//suspect thread 
foreach(var thing in whatever) 
{ 
    //do some stuff 
    SomeClass.StaticVariable = DateTime.Now; 
} 

//monitor thread 
while(shouldStillBeWorking) 
{ 
    Thread.Sleep(TimeSpan.FromMinutes(10)); 
    if (DateTime.Now.Subtract(TimeSpan.FromMinutes(15) < SomeClass.StaticVariable) 
     suspectThread.Abort() 
} 
+0

這符合我想要解決問題的方式。很高興看到它由其他人驗證。雖然我可以欣賞Eric的迴應,但它並不適合我的具體應用。多謝你們! – 2010-02-05 15:45:41

6

的優選方法是在它自己的過程運行不可靠的子系統,而不是它自己的線程。這樣,當它表現糟糕時,你可以摧毀整個過程,並讓操作系統清理它留下的任何可怕的混亂。在進程中殺死一個運行不可靠代碼的線程可能會對代碼產生各種令人討厭的副作用,因爲操作系統無法知道哪些資源屬於不良行爲線程以及哪些資源仍在使用。

長話短說:不會與您無法控制的代碼共享進程。

+0

這對我來說並不是真的可行,因爲我需要從此進程中返回結果(它是IBM MQSeries客戶端)。所以這會讓這個單獨的過程難以將數據回傳給我的應用程序。 – 2010-02-02 21:14:30

+0

@Joel:那麼你必須決定你喜歡什麼:健壯和笨重,或脆弱和容易。設計當然是爲您的客戶和利益相關者提供最佳服務的藝術。您的客戶和利益相關者是否認爲產品的耐用性高於或低於產品的易用性?儘管我的答案是 – 2010-02-02 21:30:39

+0

單獨的進程。 @Joel,你爲什麼不直接把最後一次調查的結果告訴你的監測過程(在結束過程之前)?對於進程間通信,我假設你會使用XML-RPC或其他東西。讓嫌疑人處理「奴隸」。 – 2010-02-03 22:24:16

0

在您的主應用程序中啓動一個定時器,用於在超時時間結束後中止工作線程。使用工作線程中的回調方法重置計時器。