ScriptControl, кажется, блокирует поток пользовательского интерфейса

В настоящее время я пишу приложение на C# и хотел бы позволить внешним VB-сценариям каким-либо образом манипулировать основанным на WPF GUI приложения. Эти сценарии должны иметь возможность работать очень долго и приостанавливать поток, в котором они работают (это небольшое слайд-шоу, похожее на приложение, где VBScripts определяет содержимое представления во время выполнения). Для этого я сослался на 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() и это хорошо работает (без компонента ScriptControl COM).

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

Пример скрипта:

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

0 ответов

Другие вопросы по тегам