.net Silverlight中的中断解释用户代码

.net Silverlight中的中断解释用户代码,.net,silverlight,f#,ironpython,embedded-language,.net,Silverlight,F#,Ironpython,Embedded Language,我想在Silverlight应用程序中运行一些任意用户代码。当然,我想嵌入图灵完整语言(非常简单),但不想让用户在编写一些错误(非终止)代码时锁定浏览器。我不是要解决这个问题,只是在后台线程上运行这个用户代码,然后按下按钮终止它 我不能使用线程。在Silverlight中中止,即使我想,那么如何中断后台解释器线程 我目前的想法: 如果我用手翻译某种语言,当然我可以在需要的时候停止执行 我可以使用Reflection.Emit或编译表达式树,并插入类似的检查来提前终止 修改现有编译器以生成执行此

我想在Silverlight应用程序中运行一些任意用户代码。当然,我想嵌入图灵完整语言(非常简单),但不想让用户在编写一些错误(非终止)代码时锁定浏览器。我不是要解决这个问题,只是在后台线程上运行这个用户代码,然后按下按钮终止它

我不能使用线程。在Silverlight中中止,即使我想,那么如何中断后台解释器线程

我目前的想法:

  • 如果我用手翻译某种语言,当然我可以在需要的时候停止执行
  • 我可以使用Reflection.Emit或编译表达式树,并插入类似的检查来提前终止
  • 修改现有编译器以生成执行此操作的代码(可能是F#或IronPython?)
  • 由现有工具生成的后处理IL(这是否排除了基于DLR的语言?)

我不禁想到必须有一个更简单的解决方案。

修改IronPython或IronRuby来做到这一点不会太难。最终,您只需要编写一个ExpressionVisitor,它在后分支(循环,可能是GOTO)和方法调用中插入轮询。这应该非常简单,例如,处理循环可能看起来像:

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上运行此表达式访问者

修改IronPython或IronRuby来做到这一点不会太难。最终,您只需要编写一个ExpressionVisitor,它在后分支(循环,可能是GOTO)和方法调用中插入轮询。这应该非常简单,例如,处理循环可能看起来像:

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上运行此表达式访问者

这个问题与你的问题类似:在停止线程的意义上,是的,这就是我所说的“当然,我可以在我想要的时候停止执行”。我想我希望一些基于DLR的语言会有一个功能,可以(ab)用来杀死它,或者有一个很好的选择来破坏一个好的嵌入式语言的IL。这个问题看起来和你的问题类似:在停止线程的意义上,是的,这就是我所说的“当然,我可以在我想要的时候停止执行”。我想我希望一些基于DLR的语言会有一个功能,可以(ab)用来杀死它,或者有一个很好的选择来破坏一个好的嵌入式语言的IL。