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