2011-03-28 67 views
2

我在這裏有一個奇怪的問題。我在Mono上運行Red Hat Enterprise Linux上的以下C#代碼。我看到的是Thread.Sleep(Timeout.Infinite);有時根本不會睡覺。我期望的是線程阻塞睡眠,其他線程在睡眠線程上執行一個Interrupt(),並且「Exception caught!」行被打印。System.Threading.Thread.Sleep Mono with Timeout.Infinite

我看到的是「Pre」和「Post」打印。 (順便說一下,我保持別人的代碼,我不會用睡覺,但我現在必須忍受它)。

我在網上看,並試圖看看是否有Thread.Sleep只是不會睡覺但找不到任何東西的情況。任何提示都表示讚賞。

MJ

try{ 
    Console.WriteLine("Pre"); 
    Thread.Sleep(Timeout.Infinite); 
    Console.WriteLine("Post"); 
} catch(ThreadInterruptedException e) 
{ 
    Console.WriteLine("Exception caught!"); 
} 
+1

如果將其更改爲非無限大數目,會發生什麼情況? 'int.MaxValue'已經超過24天了,是否可以切換到使用它?另外,你提到它'有時'根本不睡覺。它有多頻繁,你是否注意到它發生的任何模式? – 2011-03-28 16:55:21

+0

我試着將它設置爲一個int.MaxValue,我得到了同樣的問題。會發生什麼事,它會運行六次就好了(它是在一個循環中),然後當它打破時它就會變得瘋狂,我會看到大量的日誌。 – 2011-03-28 17:02:47

+0

如果將其設置爲中等長度,例如一個小時左右,會發生什麼情況? – 2011-03-28 17:34:48

回答

2

實際上,這是Mono中的一個錯誤。請參閱bug 683519.

1

我認爲最好的答案是用的AutoResetEvent,或者一個信號量來代替了Thread.Sleep。這應該是一個相對乾淨的交換,不應該是現有應用程序的主要體系結構更改,例如切換到ThreadPool或類似的東西。

如果這是不可能的,那麼我會看看睡眠線程是否有可能知道是否有工作要做。如果它能夠獲得這些知識,那麼將睡眠設置爲中等程度,比如說一個小時左右,假設有效。如果線程在一個小時後醒來後沒有任何工作要做,就會發現它沒有任何工作要做,然後回去睡覺。

此外,無限的睡眠不起作用,使我成爲一個相當重要的錯誤。你使用的是最新版本的Mono嗎?如果這是一個在更高版本中修復的錯誤,您是否可以切換到不同的版本?

+0

我想我明白了。有人安裝了由我們的合作伙伴開發的應用程序,它們用自己的一些替代了一些依賴項。我不知道他們能做什麼,但他們做了一些事情。 我個人也喜歡重置事件,這就是我會做的。 – 2011-03-29 13:33:17