C#在多个线程上运行IronPython

时间:2009-11-10 10:43:47

标签: c# multithreading ironpython

我有一个控制音频硬件的WPF应用程序。它在多个线程上使用相同的PythonEngine。这会导致我不时看到PythonEngines Globals字典缺少值的奇怪错误。我正在寻找有关如何调试/修复此问题的一些指导。

该设备有多个组件[过滤器,增益等]。每个组件都有多个控件[slider's,togglebutton's等]。

每次用户更改控件值时,都需要运行python脚本(来自硬件供应商)。我正在使用IronPython 1.1.2(PythonEngine.Execute(code))来执行此操作。

每个组件都有一个脚本。每个脚本都需要运行所有控件(该组件)的当前值。

序列是 - 用户进行更改>运行组件脚本>将结果发送到设备>检查失败的响应。这个整个周期需要很长时间才能保持UI等待,所以每次发生变化我都会做类似于component.begininvoke(startcycle)的事情。

Startcycle看起来像这样 -

PyEngine Engine = PyEngine.GetInstance(); // this is a singleton 
lock(component) // this prevents diff controls of the same component from walking over each other
{
  Engine.runcode(...)
}

不同的 component.begininvokes彼此接近时,很可能同时在不同的线程上发生engine.runco​​de。看起来我需要摆脱component.begininvoke,但这会使事情爬行。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能希望为每次执行创建一个EngineModule,并针对该代码执行代码。然后,所有代码都将针对不同的变量集运行。你也可能想要获得一个CompiledCode对象,并且实际上每次都对新的EngineModule执行它,因为engine.Execute每次都需要重新编译它。