10

背景

我的问题

  • 用户将需要中断其代码的执行
  • 换句话说,他们需要能够在从 cmdline 运行 Python 或 IronPython 时按 CTRL-C 来停止执行
  • 我想在 winform 中添加一个按钮,按下该按钮会停止执行,但我不确定如何执行此操作。

我的问题

  • 我怎样才能做到按下“停止”按钮实际上会停止使用输入的 IronPython 代码的执行?

笔记

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

1 回答 1

10

这基本上是对 IronPython 控制台如何处理 Ctrl-C 的改编。如果要检查源,它位于BasicConsoleand中CommandLine.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
}

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

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

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

于 2010-05-27T19:37:57.893 回答