ScriptControl, кажется, блокирует поток пользовательского интерфейса - PullRequest
0 голосов
/ 23 февраля 2012

В настоящее время я пишу приложение на C # и хотел бы позволить внешним VB-сценариям каким-либо образом манипулировать основанным на WPF GUI приложения.Эти сценарии должны иметь возможность работать очень долго и приостанавливать поток, в котором они запущены (это небольшое приложение, похожее на слайд-шоу, где скрипты VBS определяют содержимое представления во время выполнения).Для этого я сослался на COM-компонент ScriptControl и сделал мои классы ComVisible .Выбранный сценарий будет выполняться ScriptingHost следующим образом:

public void Run(Action callback)
{
  var thread = new Thread(() =>
  {
    _ScriptControl.Run("Execute", new object[] { }); // _ScriptControl is the COM component
    callback();
  });
  thread.Start();
}

Чтобы отобразить изображение в моем приложении, я использую следующий метод в моей модели представления (вызывается из VBScript):

public void ShowPicture(string path)
{
  BitmapImage bmImage = new BitmapImage();

  bmImage.BeginInit();
  bmImage.UriSource = new Uri(path, UriKind.Absolute);
  bmImage.EndInit();

  bmImage.Freeze();

  _CurrentImage = bmImage;

  RaisePropertyChanged("CurrentImage");

  // System.Windows.Forms.Application.DoEvents();
}

Свойство CurrentImage возвращает вновь созданный BitmapImage (_CurrentImage) и привязывается к элементу управления изображениями на моем виде.

Когда я запускаю скрипт, который приостанавливаетПоток сценариев (чтобы дать пользователю некоторое время для просмотра изображения) с помощью Thread.Sleep(), элемент управления изображением будет по-прежнему извлекать свойство CurrentImage после возникновения события, но изображение не будет отображаться.Если я добавлю вызов DoEvents или MessageBox.Show где-нибудь, графический интерфейс будет обновляться правильно.

Я попытался отобразить изображение, вызывающее метод ShowPicture, в отдельном потоке, за которым следовали Thread.Sleep() иэто работает хорошо (без COM-компонента ScriptControl).

Использует ли COM-компонент ScriptControl какой-либо поток пользовательского интерфейса (я уже установил AllowUI в false) или происходит какая-то другая загадочная работа COMon?

Пример сценария:

Function Execute()
    For Each picture In Source.GetPictures(False)
        Canvas.ShowPicture(picture)
        Host.Wait(5) ' Thread.Sleep(5000)
    Next
End Function
...