2
在C#4.0和IronPython 2.6中,是否可以在自己的线程中执行python脚本? 我想在传递一些事件处理程序对象之后生成脚本,以便它可以在运行时更新GUI。在C#中异步运行IronPython脚本
在C#4.0和IronPython 2.6中,是否可以在自己的线程中执行python脚本? 我想在传递一些事件处理程序对象之后生成脚本,以便它可以在运行时更新GUI。在C#中异步运行IronPython脚本
我会用一个Task:
ScriptEngine engine = ...;
// initialize your script and events
Task.Factory.StartNew(() => engine.Execute(...));
IronPython的脚本,然后在一个单独的线程上运行。确保您的事件处理程序在更新GUI时使用适当的同步机制。
您可以使用后台工作器在单独的线程上运行脚本。然后使用ProgressChanged和RunWorkerCompleted事件处理程序更新ui。
BackgroundWorker worker;
private void RunScriptBackground()
{
string path = "c:\\myscript.py";
if (File.Exists(path))
{
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(bw_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
worker.RunWorkerAsync();
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// handle completion here
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// handle progress updates here
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
// following assumes you have setup IPy engine and scope already
ScriptSource source = engine.CreateScriptSourceFromFile(path);
var result = source.Execute(scope);
}
我真的遇到了这个问题,并尝试它,但注意到一个问题......如果ScriptSource.Execute()抛出异常,它不会被围绕任务调用的try catch块捕获。它只是打破了这条线...有什么办法来处理这个例外吗? – 2010-06-10 19:16:37
我会将.Execute()调用移动到一个新函数中,并将try/catch放在该函数中,然后使用新函数ala'Task.Factory.StartNew(MyExecute)'或Task.Factory.StartNew ()=> MyExecute(...))'如果你需要关闭。 – 2010-06-10 19:47:42