2011-10-30 4 views
2

Silverlightアプリケーションで任意のユーザーコードを実行したいと考えています。もちろん、チューリング完全言語を埋め込みたいですが、悪い(終端でない)コードを書くと、ユーザーがブラウザをロックすることを許可したくありません。私はHalting Problemを解決するように求めていません。バックグラウンドスレッドでこのユーザーコードを実行し、ボタンを押すだけで終了できます。Silverlightで解釈されるユーザーコードの割り込み

私がしたい場合でもSilverlightでThread.Abortを使用することはできません。どうすればバックグラウンドインタープリタスレッドを中断できますか?

私の現在の考え方:

  • 私は手でいくつかの言語を解釈する場合は、もちろん私は
  • をしたいとき、私はReflection.Emitを使用するか、または式ツリーをコンパイルし、同様のチェックを挿入することができ、実行を停止することができます早期終了に
  • を行うには、この実行するコードを生成するために、既存のコンパイラを変更します(多分F#やIronPythonのを?)既存のツールで生成
  • 後処理IL(このルールを出していDLRベースの言語を?)

もっと簡単な解決策があるとは思えません。

+0

この質問は、あなたのようになります:はい、スレッドを停止させる意味でhttp://stackoverflow.com/questions/472431/unable-to-kill-a-worker-thread-in-silverlight –

+0

、この「もちろん、私が欲しいときに実行を止めることができる」という意味です。私は、DLRベースの言語には、それを殺すのに使うことができる機能を持っていることを望んでいたと思っていました。そうでなければ、すばらしい組み込み可能な言語のILをmanglingする良いオプションがあります。 –

答えて

0

これを行うためにIronPythonまたはIronRubyを変更することはあまり難しくありません。最終的には、バック・ブランチ(ループ、おそらくはgotos)とメソッド呼び出しにポーリングを挿入するExpressionVisitorを書くだけで済みます。あなたがFunctionCodeオブジェクトが構築されているときに提供ラムダにこの発現ビジターを実行できますIronPythonのため

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 { 
} 

:例扱うループのように見える可能性があるため、これはかなり簡単にする必要があります。

関連する問題