Это в основном адаптация того, как консоль 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
.