我正在创建一个WPF MVVM应用程序。我有一个长时间运行的进程,我希望在显示忙碌指示器给用户的同时在另一个线程中运行。我遇到的问题如下:
BusyIndicator控件的IsBusy属性绑定到实现INotifyPropertyChanged接口的我的视图模型的IsBusy公共属性。如果我使用Join运行下面的代码,则主UI线程等待线程“t”完成时,用户界面不会显示忙碌指示器。如果我删除join,则托管WPF的Windows表单关闭得太早。我知道跨线程访问Windows Forms是不可取的,但由于我只想关闭窗体,所以我认为最简单的解决方案是将_hostForm.Close()移动到“DoLongProcess”方法的末尾。当然,如果我这样做,就会出现跨线程异常。请建议在这种情况下采取的最佳方法。
BusyIndicator控件的IsBusy属性绑定到实现INotifyPropertyChanged接口的我的视图模型的IsBusy公共属性。如果我使用Join运行下面的代码,则主UI线程等待线程“t”完成时,用户界面不会显示忙碌指示器。如果我删除join,则托管WPF的Windows表单关闭得太早。我知道跨线程访问Windows Forms是不可取的,但由于我只想关闭窗体,所以我认为最简单的解决方案是将_hostForm.Close()移动到“DoLongProcess”方法的末尾。当然,如果我这样做,就会出现跨线程异常。请建议在这种情况下采取的最佳方法。
<extToolkit:BusyIndicator IsBusy="{Binding Path=IsBusy}" >
<!-- Some controls here -->
</extToolkit:BusyIndicator>
private void DoSomethingInteresting() {
// Set the IsBusy property to true which fires the
// notify property changed event
IsBusy = true;
// Do something that takes a long time
Thread t = new Thread(DoLongProcess);
t.Start();
t.Join();
// We're done. Close the Windows Form
IsBusy = false;
_hostForm.Close();
}