我想在Silverlight应用程序中运行一些任意用户代码。当然我想嵌入一个图灵完备语言(很容易),但是如果他们写了一些坏的(非终止)代码,就不想让用户锁定他们的浏览器。我不是要求解决Halting Problem,只需在后台线程上运行此用户代码,然后按下按钮即可终止它。
即使我想要,也无法在Silverlight中使用Thread.Abort,那么如何中断后台解释器线程呢?
我目前的想法:
我不禁认为必须有一个更简单的解决方案。
答案 0 :(得分:0)
修改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对象时提供的lambda上运行此表达式visitor。