Возможно ли в середине выполнения функции установить указатель на текущий стек (который будет выбран позже), а затем освободить текущий поток (без разворота стека вызовов) и вернуть его в пул потоков ? И затем, еще один поток, который поднимает, где эта нить прекратилась? Я знаю, это означало бы, что кто-то, звонящий в функцию, не знал бы, что текущий контекст потока изменился бы, и это, вероятно, связано с написанием некоторого пользовательского кода IL, чтобы сделать что-то вроде этого, но есть ли какой-нибудь способ сделать это?В .NET, стек вызовов неразрывно связан с потоком?
ответ
Нет, стек является частью состояния нити. Вы можете использовать асинхронные рабочие процессы для такого рода вещей (и CCR делает это проще), но вы не можете просто вернуть поток в пул потоков.
Вы можете написать пул потоков, который сделал, но это было бы плохой идеей. ИМО - это был бы поток пула эквивалент вызова Application.DoEvents IMO.
То, что вы описываете, - это разграниченные продолжения. К сожалению, CLR не поддерживает этого и не может быть реализован в управляемом коде (даже смешанном коде) с любыми трюками, которые я знаю.
В настоящее время мне нужна эта функциональность в IronScheme. Есть способы создать такую функциональность в среде CLR, написав компилятор, который выполняет преобразование CPS, но это вызывает множество проблем взаимодействия (вы не можете напрямую обращаться к функциям .NET и т. Д.).
Я провел несколько экспериментов с конверсией CPS в IronScheme, но мой текущий компилятор для этого не подходит и работает довольно медленно.
Вы можете написать более подробную информацию о проблеме, которую вы пытаетесь решить? – cbrulak