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

Posted

技术标签:

【中文标题】在 WinForms 应用程序中嵌入 IronPython 并中断执行【英文标题】:Embedding IronPython in a WinForms app and interrupting execution 【发布时间】:2011-02-24 18:02:10 【问题描述】:

背景

我已经成功地将 IronPython 嵌入到我的 WinForm 应用程序中,使用如下所述的技术:http://blog.peterlesliemorris.com/archive/2010/05/19/embedding-ironpython-into-a-c-application.aspx 在嵌入的上下文中,我的用户可以编写任何循环等。 我正在使用 IronPython 2.6(用于 .NET 2.0 的 IronPython 和用于 .NET 4.0 的 IronPython)

我的问题

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

我的问题

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

注意事项

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在 WinForms 应用程序中嵌入 IronPython 并中断执行的主要内容,如果未能解决你的问题,请参考以下文章

在 Winforms-Application 中嵌入的 Unity-Application 上调用函数 [重复]

可以将 WinForms 嵌入到 VCL Delphi 应用程序中吗?

在 WinForms 中嵌入 XNA

.NET 在 Windows 任务栏中嵌入应用程序

在 WPF/C# 中嵌入 Firefox/Gecko

将一个 Unity .exe 文件嵌入到多个 WPF 页面中