我们有一个工具可以重新托管.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之后从视图中进行数据绑定会抛出异常:(
答案 0 :(得分:-1)
您是否可以在UI级别创建WorkflowDesigner,然后使用您的代码在UI线程中创建和加载新的第二个WorkflowDesigner。
然后,当第二个WorkflowDesigner准备就绪时,将第一个WorkflowDesigner =设为第二个WorkflowDesigner。通过回电我会想。
加载的WorkflowDesigner现在位于UI线程中,您可以运行RaisePropertyChanged