Как выполнить скрипт IronPython в отдельном потоке, а затем приостановить его? - PullRequest
4 голосов
/ 27 октября 2010

Допустим, у меня есть такой код для тестирования.

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 класс пытается отозвать функцию Sleep класса PythonCallBack и хочет на некоторое время приостановить работу.

public static class PythonCallBack
{
    public static SimpleScheduler Scheduler;

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

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

PythonCallBack только для вызова спящего метода SimpleScheduler.

Вопрос: Каков наилучший способ приостановить поток, который выполняет сценарий? а потом как возобновить выполнение этого потока?

1 Ответ

2 голосов
/ 27 октября 2010

Класс Thread имеет метод Suspend() и Resume(). Эти методы приостанавливают и возобновляют поток. Несмотря на предупреждение об этом методе, это не должно быть проблемой, потому что вы приостановлены в известном месте.

Альтернативой является использование событий. Вы можете присвоить Script или ScriptScope классу AutoResetEvent. Затем в Sleep() вы звоните WaitOne() на событие. Затем извне, когда вы хотите возобновить поток, вы звоните Set().

...