Запуск сценария IronPython в C # асинхронно - PullRequest
2 голосов
/ 10 июня 2010

В C # 4.0 и IronPython 2.6 возможно ли выполнить скрипт на Python в своем собственном потоке?Я хотел бы создать скрипт после передачи некоторых объектов обработчика событий, чтобы он мог обновлять графический интерфейс при запуске.

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Вы можете использовать фоновый рабочий для запуска скрипта в отдельном потоке. Затем используйте обработчики событий ProgressChanged и RunWorkerCompleted для обновления пользовательского интерфейса.

  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);
  }
3 голосов
/ 10 июня 2010

Я бы использовал Задание :

ScriptEngine engine = ...;
// initialize your script and events

Task.Factory.StartNew(() => engine.Execute(...));

Затем сценарий IronPython будет выполняться в отдельном потоке. Убедитесь, что ваши обработчики событий используют соответствующий механизм синхронизации при обновлении графического интерфейса.

...