2013-01-31 28 views
1

我不確定在將任務分配給線程時C#是如何工作的。是否有可能在C#中的同一線程上同時運行兩個任務?

我想驗證一些東西。是否保證在任何時候,每個任務都由一個且只有一個線程處理,而不管該任務在做什麼,即使它剛剛停止或執行了Thread.currentThread()。sleep(),該線程也不會去並服務於其他任務?那麼它在線程和任務之間的1:1呢?無論任務在做什麼,即使它只是在睡覺,或者任務是通過Task.Run調用還是等待Task.Run等?

回答

3

有幾種情況我知道哪些任務可以重新進入。一個是一個任務正在等待另一個任務完成,並且該第一個任務尚未開始。在這種情況下,在當前線程上啓動新任務是有意義的...。它的確提出了一些關於鎖定和任何其他線程本地上下文的令人討厭的擔心。

如果調度程序認爲它合適,也可以(顯然)Task.Factory.StartNew執行一個新的「內聯」任務,但.NET內置的調度程序不會這樣做。

請參閱this other Stack Overflow question,其中包括來自Stephen Toub(PFX團隊)的更詳細回覆。

+0

非常感謝。因此,如果兩個任務都已啓動並且還沒有返回,那麼它們都在同一個線程上執行是完全不可能的? – xander

+0

@xander:請參閱我的編輯 - 考慮到您可以構建自己的任務調度程序,因此很難給出任何絕對值。仔細閱讀Stephen Toub的回覆可能是最好的選擇。請注意,據我所知,任務不會更改線程,因此如果兩個任務已經在單獨的線程上啓動,它們將不會在同一個線程中結束。 –

+0

非常感謝您的參考。我在這裏唯一不確定的是:「如果兩個任務已經在單獨的線程上啓動」。默認行爲是在單獨的線程上啓動任務,而沒有前面提到的特殊情況? – xander

相關問題