記住異步CTP通過環境SynchronizationContext
促進隱式調度,是否有任何理由爲什麼我不應該使我的CancellationToken
和IProgress
環境呢?異步CTP - 環境CancellationToken和IProgress
我目前正在通過這些方法,很像我通過TaskScheduler
周圍顯式調度。然而,看到調度器現在應該是環境的,可能我不遵循相同的規則來解決其他難題?
記住異步CTP通過環境SynchronizationContext
促進隱式調度,是否有任何理由爲什麼我不應該使我的CancellationToken
和IProgress
環境呢?異步CTP - 環境CancellationToken和IProgress
我目前正在通過這些方法,很像我通過TaskScheduler
周圍顯式調度。然而,看到調度器現在應該是環境的,可能我不遵循相同的規則來解決其他難題?
CancellationToken
對於這個比IProgress<T>
更可能。在IProgress<T>
中,您經常在不同的級別使用不同的T
(更高級別的async
方法組合了其低級await
調用的進度通知)。用CancellationToken
,同樣的道理幾乎總是傳遞給更低層的方法(假設它們支持取消)。 CancellationToken
確實支持一些非常先進的組合器,但它們很少被使用。
主要的缺點是你會離開基於任務的異步模式。您必須記住,任何微軟或第三方代碼都會採用明確的CancellationToken
- sp,您必須明確將其從最低級別async
方法中的環境上下文中提取出來。此外,稍後維護代碼庫的程序員可能會期待TAP。
當您考慮實施時,還有一個挑戰。即使它們更改了線程上下文,您也會希望隱式CancellationToken
遵循async
方法的調用。我的意思是,考慮這一點:在等待方法B
的結果之前,方法A
調用ConfigureAwait(false)
。您不能使用簡單的線程局部靜態屬性,因爲您需要遵循異步執行上下文從一個線程到另一個線程。
我似乎還記得有關如何執行此操作的方法(可能使用CallContext
類?),但只要您執行此操作,性能坦克(執行上下文遷移代碼已針對默認方案進行了高度優化)。
再次感謝您的詳細答案:) – 2012-01-08 11:08:22
「我似乎回想起讀取此方法的方法(可能使用CallContext類?)......」是的,.NET 4.5的當前內部版本支持此,但這不是在// BUILD發佈的版本。 – 2012-01-08 20:45:47