是否可以在函数执行过程中设置指向当前堆栈的指针(稍后获取)然后释放当前线程(不解除调用堆栈)并将其返回给线程池?然后,让另一个线程在该线程停止的地方继续?我知道这意味着调用函数的人不会知道当前的线程上下文会发生变化,并且可能会涉及编写一些自定义的IL代码来做这样的事情,但有没有办法做到这一点?
不,堆栈是线程状态的一部分.您可以使用异步工作流来执行此类操作(并且CCR使这更容易)但您不能只是将线程返回到线程池.
你可以写一个线程池没有做到这一点,但是这将是一个糟糕的主意IMO -这将是线程池相当于调用Application.DoEvents IMO的.
你所描述的是分隔的延续.遗憾的是,CLR不支持这一点,并且不能用我知道的任何技巧在托管代码(甚至是混合代码)中实现.
目前,我在IronScheme中需要此功能.有一些方法可以在CLR上创建这种功能,方法是编写一个执行CPS转换的编译器,但这会导致许多互操作性问题(您不能直接调用.NET函数等).
我已经在IronScheme中进行了一些CPS转换实验,但是我目前的编译器并不适合这个,而且执行速度相当慢.