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