2015-09-05 95 views
3

我有一个不寻常的场景,我需要暂停和稍后恢复线程的执行状态,有可能在不同的线程上恢复它。如何保留并稍后恢复线程的执行状态?

有两种功能可以完成我想要的功能,Thread.GetCompressedStackThread.SetCompressedStack,但两者都不推荐使用,也没有替代选项。 MSDN引用CompressedStack.Capture,但它不允许恢复捕获的堆栈。

有没有办法为我做到这一点?

+2

我认真地怀疑你可以在托管代码中这样做,甚至在本机中也很难。请注意,“CompressedStack”与实际堆栈几乎没有任何关系 - 它基本上是当前调用的CAS权限/拒绝列表......考虑提供有关您的实际目标的信息,因为可能没有那么疯狂的方法来实现它。 –

+0

@AlexeiLevenkov:我有一个检索资源的库。外部代码通过调用我的库的任务来饱和一个线程池。检索资源可能需要很长时间(可能需要几分钟),并且数千个任务可能会请求相同的资源,从而阻止其所需资源已被缓存的其他任务。我想暂停等待任务以释放线程池的线程;我控制线程池和检索,但不控制正在线程池上运行的任务。 –

+1

@CollinDauphinee - 评论中的文字应该在你的问题中。现在你的问题很明显是[XY问题](http://meta.stackexchange.com/a/66378/144156)。你最好解决你的潜在问题。 – Enigmativity

回答

1

CompressedStack不是CLR执行堆栈。不做你想做的事。

基本上,你不能这样做,因为从字面上问。

感谢await,不过,如果您确定让整个呼叫链返回Task s,您可以这样做。您可以使用PauseToken暂停任何任务。您的代码将如下所示:

async Task MyCode(PauseToken pt) { 
while (true) { 
    await DoSomething(); 
    await pt.WaitWhilePausedAsync(); 
} 
} 

类似的东西。

1

您可以暂停和恢复任务,但不改变其主题。

但是,您可以将操作链接在不同的任务中,我的意思是,您可以将您的例程分成若干部分并将它们一起处理,等待他们的答案以开始最终任务 - 并且我描述的所有操作都可以暂停和/或链接只有当结果已经可用时才开始任务。

还可以监视资源暂停和继续你的任务,如果问题与此有关。

查看的可能性完整描述:

https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx