在WinForms应用程序中嵌入IronPython并中断执行

nam*_*los 10 ironpython python-embedding

背景

我的问题

  • 用户需要中断其代码的执行
  • 换句话说,当从cmdline运行Python或IronPython时,他们需要点击CTRL-C以暂停执行的能力
  • 我想在winform中添加一个按钮,当按下时会暂停执行,但我不知道该怎么做.

我的问题

  • 如何按下"停止"按钮实际上会停止使用输入的IronPython代码的执行?

笔记

  • 注意:我不想简单地丢弃"会话" - 我仍然希望用户能够与会话进行交互并访问在暂停之前可用的任何结果.
  • 我假设我需要在一个单独的线程中执行此操作,正确执行此操作的任何指导或示例代码将不胜感激.

Jef*_*rdy 10

这基本上是对IronPython控制台如何处理Ctrl-C的改编.如果你想检查来源,它就在BasicConsoleCommandLine.Run.

首先,在一个单独的线程上启动IronPython引擎(如您所愿).当您运行用户代码时,将其包装在一个try ... catch(ThreadAbortException)块中:

var engine = Python.CreateEngine();
bool aborted = false;
try {
    engine.Execute(/* whatever */);
} catch(ThreadAbortException tae) {
    if(tae.ExceptionState is Microsoft.Scripting.KeyboardInterruptException) {
        Thread.ResetAbort();
        aborted = true;
    } else { throw; }
}

if(aborted) {
    // this is application-specific
}
Run Code Online (Sandbox Code Playgroud)

现在,您需要保持对IronPython线程的引用.在表单上创建一个按钮处理程序,然后调用Thread.Abort().

public void StopButton_OnClick(object sender, EventArgs e) {
    pythonThread.Abort(new Microsoft.Scripting.KeyboardInterruptException(""));
}
Run Code Online (Sandbox Code Playgroud)

KeyboardInterruptException参数允许Python线程捕获ThreadAbortException并将其作为一个处理KeyboardInterrupt.