2014-08-27 59 views
0

我有一個應用程序,這是一種測試某人,並持續約30分鐘。在程序開始(第三方)期間,我的代碼被調用,我註冊時間並嚮應用程序返回一些信息,並將測試保存爲「正在進行」。C#垃圾收集器的「KeepAlive」和線程

大約30分鐘後,我希望程序回到我身邊並將測試結果發送給我,以便我可以保存並完成該過程。有時候這種情況不會因爲各種原因而發生 所以我在實現一個代碼來啓動一個線程,睡它大約35分鐘(它可以達到的最大持續時間),當它運行它只做一件事:如果測試仍然是「正在進行」,它將其更新爲「失敗」或其他狀態。

不過,我從here讀到C#的垃圾回收器可以收集它假定爲不活動線程,我很擔心這一點,所以我想請問這如何KeepAlive方法使用線程工作,或者如果有任何可靠的方法來測試它(因爲即使我等了所有35分鐘纔會發生,也可能出現GC實際收集線程並且一切都失敗的情況)。

那麼,這個工作的正確方法是什麼?或者如果不是這樣,我該怎麼做?

static void Main(string[] args) 
{ 
    //After all the startup functions are done... 
    Thread thread = new Thread(() => UpdateTest(1)); 
    thread.Start(); 

    //My thread is supposedly safe...? 
    GC.KeepAlive(thread); 
} 

static void UpdateTest(int testID) 
{ 
    Thread.Sleep(210000); //Sleep for 35min 

    //Search the database for the testID, update it if it's still ONGOING. 
} 
+0

會爲長時間運行的進程提供服務來處理這個問題嗎? – JNYRanger 2014-08-27 19:10:34

+0

如果你正在談論jitbit的答案,我懷疑除此之外還有更多。這不是GC ......基本上這個問題是你已經鏈接的問題的重複,不是嗎? – 2014-08-27 19:13:42

+0

@JonSkeet我不認爲它是重複的,因爲我的線程根本不會運行,它會在啓動之前睡眠很長時間,所以基本上這是一個關於jitbit的答案的問題。這就是爲什麼我尋找解決方案並找到了有關KeepAlive方法的原因。 – Danicco 2014-08-27 19:17:01

回答

5

線程不會由於GC而中止。事實上,不可能可靠地中止一個線程。 (嘗試中止try {} finally { while(true); }。)

您引用的答案是錯誤的。但是在這個問題上有三個正確的答案。你恰好相信錯誤的少數人的答案。

你沒有問題要解決。

+0

我懷疑答案會長得多。 – 2014-08-27 19:29:05

+2

@LynnCrumbling高級經驗的SO用戶有責任降低這些答案。到目前爲止,責任還沒有被接受。 – usr 2014-08-27 19:29:48

+0

@usr我現在正在這樣做。我不確定這個可憐的答案是如何得到保證的。和+1 .. – 2014-08-27 19:32:12