2013-02-12 16 views
4

我使用TaskCompletionSource來提供並驅動一個Task的實例。我希望能夠將Task設置爲狀態Running,以表明該任務是......「正在運行」,但我無法通過TaskCompletionSource找到實現此目的的方法。有沒有辦法通過TaskCompletionSource設置一個任務驅動狀態'正在運行'?

有沒有辦法做到這一點?

+0

你爲什麼要那樣?你爲什麼關心「Task」的狀態? – svick 2013-02-12 17:49:42

+1

那麼,我會轉過來問「爲什麼任務有運行狀態?」。也許這種狀態表示的是與任務運行的一般想法不同的東西,因此不適用於由TCS支持的任務。如果不是,我想表示該任務正在運行(或「正在發生」)任務的消費者。 – mackenir 2013-02-12 17:57:48

+0

*** TL; DR **你需要建立一個更高級別的通知抽象。*'也許這個狀態表示的信息與任務運行的一般想法不同 - 我認爲這很重要。你使用'Task'是一個實現細節,'TaskStatus'用於支持TPL的*基礎結構,如鏈接延續和支持任務調試(因此狀態如'WaitingForChildrenToComplete')。問問你自己,如果使用pre-'Task'異步方法,你將如何實現這一點,然後將其改寫爲Task。 APM也不提供「運行」狀態。 – shambulator 2013-02-16 12:21:42

回答

3

不,沒有辦法。

不管你喜不喜歡我的回答,但是,這是正確的。 :-)

以下是我的看法,並試圖幫助你感覺更好。

Task.Status有幾個狀態,只有在任務是計劃任務時纔會設置並且有用。來自TaskCompletionSource的任務不是計劃任務。 WaitingToRun,Running等概念因此不適用於傳統的計劃任務意義上。如果您確實有能力設置這些值,則您必須決定應用於這些值的語義,這可能與其他人解釋它們的方式相沖突。

最終,我不認爲你的代碼應該永遠不會根據這些中間狀態作出任何決定。這樣做聽起來像是一種「代碼味道」。

+2

我不同意 - 爲什麼暴露這些國家,如果他們不應該使用。如果我們喋喋不休,我會聞到「抽象漏洞」。 ;-) 儘管如此,我認爲你的答案是正確的 - 「沒有辦法」。謝謝 – mackenir 2013-04-09 12:52:52

+0

這並不是說他們不應該被使用,所以也許我使用了過於強大的語言。它們應該被使用時非常罕見。例如,如果您正在實現TaskScheduler,那麼它們*可能會有用。我已經在TPL中編寫了10,000行代碼,並且我只使用了這些中間TaskStatus值幾次。 – 2013-04-27 17:57:07

相關問題