ScriptControl似乎阻止了UI线程

时间:2012-02-22 22:32:56

标签: c# wpf multithreading vbscript scriptcontrol

我目前正在用C#编写应用程序,并希望允许外部VB脚本以某种方式操作应用程序的基于WPF的GUI。应该允许这些脚本运行很长时间并暂停它们运行的​​线程(这是一个像应用程序那样的幻灯片放映,其中VBScripts在运行时确定视图的内容)。为此,我引用了 ScriptControl COM组件并使我的类 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,GUI将正确更新。

我试图在一个单独的线程中显示一个调用ShowPicture方法的图像,然后是Thread.Sleep(),这样做效果很好(没有ScriptControl COM组件)。

ScriptControl COM组件是否以某种方式使用UI线程(我已将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 个答案:

没有答案