2011-10-30 9 views
2

Silverlight 응용 프로그램에서 임의의 사용자 코드를 실행하고 싶습니다. 물론 Turing-complete 언어를 쉽게 포함하고 싶지만 나쁜 (종료하지 않는) 코드를 작성하면 사용자가 브라우저를 잠그지 못하도록하고 싶지는 않습니다. 나는 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 기반의 언어가 그것을 죽이기 위해 (ab) 사용될 수있는 기능을 가지기를 바랄 것입니다. 그렇지 않으면 좋은 embeddable 언어의 일리노이를 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 { 
} 

제공 : 예 처리 루프 모양을 수있는이 꽤 쉽게해야합니다.

관련 문제