2010-10-27 40 views
4

让我们假设我有这样的代码进行测试。如何在单独的线程中执行IronPython脚本,然后挂起它?

public class SimpleScheduler 
{ 
    public Script Script { get; set; } 

    private Thread _worker; 

    public void Schedule() 
    { 
     this._worker = new Thread(this.Script.Execute); 
     this._worker.Start(); 
    } 

    public void Sleep() 
    { 
     //? 
    } 
} 

SimpleScheduler只是需要Script对象,并试图在单独的线程来执行它。

public class Script 
    { 
     public string ID { get; set; } 

     private ScriptSource _scriptSource; 

     private ScriptScope _scope; 

     private CompiledCode _code; 

     private string source = @"import clr 
clr.AddReference('Trampoline') 
from Trampoline import PythonCallBack 
def Start(): 
    PythonCallBack.Sleep()"; 

     public Script() 
     { 
      _scriptSource = IronPythonHelper.IronPythonEngine.CreateScriptSourceFromString(this.source); 
      _scope = IronPythonHelper.IronPythonEngine.CreateScope(); 
      _code = _scriptSource.Compile(); 
     } 

     public void Execute() 
     { 
      _code.Execute(_scope); 
      dynamic start = _scope.GetVariable("Start"); 
      start(); 
     } 
    } 

Script类尝试回调PythonCallBack类的睡眠功能,并希望暂停一段时间。

public static class PythonCallBack 
{ 
    public static SimpleScheduler Scheduler; 

    static PythonCallBack() 
    { 
     Scheduler = new SimpleScheduler(); 
    } 

    public static void Sleep() 
    { 
     Scheduler.Sleep(); 
    } 
} 

PythonCallBack仅用于调用SimpleScheduler的睡眠方法。

问题: 挂起线程,执行脚本的最佳方法是什么?然后如何恢复这个线程执行?

回答

2

Thread类有一个Suspend()Resume()方法。这些方法暂停和恢复线程。即使有关于此方法的警告,但这不应该成为问题,因为您正在某个已知位置暂停。

另一种方法是使用事件。您可以给ScriptScriptScope分类AutoResetEvent。然后,在Sleep()上,您可以致电WaitOne()参加活动。然后,从外部,当您希望线程恢复时,请致电Set()

+0

Suspend()和Resume()方法已弃用且线程同步不安全 – 2010-10-28 08:46:25

+0

已更新答案。 – 2010-10-28 09:23:18

相关问题