答案 0 :(得分:10)
这基本上是对IronPython控制台如何处理Ctrl-C的改编。如果您想查看来源,请点击BasicConsole
和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
处理。