我有一個不尋常的場景,我需要暫停和稍後恢復線程的執行狀態,有可能在不同的線程上恢復它。如何保留並稍後恢復線程的執行狀態?
有兩種功能可以完成我想要的功能,Thread.GetCompressedStack
和Thread.SetCompressedStack
,但兩者都不推薦使用,也沒有替代選項。 MSDN引用CompressedStack.Capture
,但它不允許恢復捕獲的堆棧。
有沒有辦法爲我做到這一點?
我有一個不尋常的場景,我需要暫停和稍後恢復線程的執行狀態,有可能在不同的線程上恢復它。如何保留並稍後恢復線程的執行狀態?
有兩種功能可以完成我想要的功能,Thread.GetCompressedStack
和Thread.SetCompressedStack
,但兩者都不推薦使用,也沒有替代選項。 MSDN引用CompressedStack.Capture
,但它不允許恢復捕獲的堆棧。
有沒有辦法爲我做到這一點?
CompressedStack
不是CLR執行堆棧。不做你想做的事。
基本上,你不能這樣做,因爲從字面上問。
感謝await
,不過,如果您確定讓整個呼叫鏈返回Task
s,您可以這樣做。您可以使用PauseToken
暫停任何任務。您的代碼將如下所示:
async Task MyCode(PauseToken pt) {
while (true) {
await DoSomething();
await pt.WaitWhilePausedAsync();
}
}
類似的東西。
您可以暫停和恢復任務,但不改變其主題。
但是,您可以將操作鏈接在不同的任務中,我的意思是,您可以將您的例程分成若干部分並將它們一起處理,等待他們的答案以開始最終任務 - 並且我描述的所有操作都可以暫停和/或鏈接只有當結果已經可用時纔開始任務。
還可以監視資源暫停和繼續你的任務,如果問題與此有關。
查看的可能性完整描述:
https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx
我認真地懷疑你可以在託管代碼中這樣做,甚至在本機中也很難。請注意,「CompressedStack」與實際堆棧幾乎沒有任何關係 - 它基本上是當前調用的CAS權限/拒絕列表......考慮提供有關您的實際目標的信息,因爲可能沒有那麼瘋狂的方法來實現它。 –
@AlexeiLevenkov:我有一個檢索資源的庫。外部代碼通過調用我的庫的任務來飽和一個線程池。檢索資源可能需要很長時間(可能需要幾分鐘),並且數千個任務可能會請求相同的資源,從而阻止其所需資源已被緩存的其他任務。我想暫停等待任務以釋放線程池的線程;我控制線程池和檢索,但不控制正在線程池上運行的任務。 –
@CollinDauphinee - 評論中的文字應該在你的問題中。現在你的問題很明顯是[XY問題](http://meta.stackexchange.com/a/66378/144156)。你最好解決你的潛在問題。 – Enigmativity