这基本上是对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
.