如何在后台线程中将工作流加载到重新托管的WorkflowDesigner中?

时间:2014-07-23 09:39:48

标签: wpf multithreading threadpool workflow-foundation-4

我们有一个工具可以重新托管.NET 4.0.1的WorkflowDesigner。我们正在加载非常繁重的工作流程,需要15秒才能完成 WorkflowDesigner.Load()方法。所有这些都在UI线程中完成,冻结显示并阻止用户进行交互。

所以我想在后台线程中准备WorkflowDesigner,一旦准备好显示,我想将它交换到我的视图中。

我遇到了众所周知的问题,即无法从非UI线程创建或操作UI对象。然而,将应用程序锁定15秒是不行的。

是否有任何解决方法来加载并保持UI响应? (目前我们无法切换到.NET 4.5.1,如果这样做会有所不同......)

到目前为止我尝试的是

            Thread thread = new Thread(() => LoadWorkflowDesigner());
            thread.Name = "WorkflowDesignerLoader";
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();

并在创建的帖子中

    [STAThread]
    private void LoadWorkflowDesigner()
    {
            WorkflowDesigner tmpDesigner = new WorkflowDesigner();
            tmpDesigner.Load(WorkflowPath);
            this.WorkflowDesignerView = tmpDesigner;
            RaisePropertyChanged(() => WorkflowDesignerView);

这种方式创建确实有效,但是在RaisePropertyChanged之后从视图中进行数据绑定会抛出异常:(

1 个答案:

答案 0 :(得分:-1)

您是否可以在UI级别创建WorkflowDesigner,然后使用您的代码在UI线程中创建和加载新的第二个WorkflowDesigner。
然后,当第二个WorkflowDesigner准备就绪时,将第一个WorkflowDesigner =设为第二个WorkflowDesigner。通过回电我会想。

加载的WorkflowDesigner现在位于UI线程中,您可以运行RaisePropertyChanged