Модификация IronPython или IronRuby для этого не будет слишком сложной.В конечном итоге вам просто нужно написать ExpressionVisitor, который вставляет опрос в ответвления (циклы, может быть gotos) и вызовы методов.Это должно быть довольно просто, например, обработка циклов может выглядеть следующим образом:
public class AbortPollRewriter : ExpressionVisitor {
protected override Expression VisitLoop(LoopExpression node) {
var body = Expression.Block(
Expression.Call(typeof(AbortPollRewriter).GetMethod("Poll")),
node.Body
);
return Expression.Loop(body, node.BreakLabel, node.ContinueLabel);
}
[ThreadStatic]
private static bool _aborting;
public static void Abort() {
_aborting = true;
}
public static void Poll() {
if (_aborting) {
throw new MyThreadAbortException();
}
}
}
class MyThreadAbortException : Exception {
}
Для IronPython вы можете запустить этот посетитель выражения для лямбда-выражения, предоставленного при создании объектов FunctionCode.