我有一个不寻常的场景,我需要暂停和稍后恢复线程的执行状态,有可能在不同的线程上恢复它。如何保留并稍后恢复线程的执行状态?
有两种功能可以完成我想要的功能,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