先上源码:
namespace touchPy.Loading { public class MyLoading { public static readonly MyLoading Instance = new MyLoading(); private ScheduleBarWindow _mld;//loading对象 Thread _newWindowThread;//loading线程 object obj = new object(); bool isStart = false; private MyLoading() { } #region 载入loading控件 /// <summary> /// 载入loading控件 /// </summary> public void LoadingStart() { isStart = true; _newWindowThread = new Thread(new ThreadStart(Loading)); _newWindowThread.SetApartmentState(ApartmentState.STA); _newWindowThread.IsBackground = true; _newWindowThread.Start(); //threadLst.Add(_newWindowThread); } #endregion #region 线程载入函数 private void Loading() { _mld = new ScheduleBarWindow(); _mld.ShowDialog(); //System.Windows.Threading.Dispatcher.Run(); } #endregion #region 结束线程,关闭loading /// <summary> /// 结束线程,关闭loading /// </summary> public void LoadingEnd() { if(isStart) { while (_mld == null) { Thread.Sleep(10); } _mld.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); _newWindowThread.Abort(); isStart = false; } } #endregion #region 结束线程,关闭loading /// <summary> /// 结束线程,关闭loading /// </summary> public void LoadingEnd(UCTreeView _treeView) { Thread _WindowThread = new Thread(LoadingHalt); _WindowThread.SetApartmentState(ApartmentState.STA); _WindowThread.IsBackground = true; _WindowThread.Start(_treeView); } #endregion void LoadingHalt(object data) { if (isStart) { UCTreeView _tree = data as UCTreeView; bool bFlag = (bool)_tree.Dispatcher.Invoke(new Func<bool>(()=>{ return _tree.IsLoaded; }), null); while (_mld == null || !bFlag) { bFlag = (bool)_tree.Dispatcher.Invoke(new Func<bool>(() => { return _tree.IsLoaded; }), null); Thread.Sleep(10); } _mld.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); _newWindowThread.Abort(); isStart = false; } } } }
C#线程为单线程模式,所有界面资源线程之间不能共享,对于主线程中后台代码业务处理比较耗时的情况下,需要添加新的线程处理另外一些界面效果。
IsLoad属性,作为界面数据使用数据绑定方式产生延迟的返回结果,告诉用为前台渲染效果是否完成,是否取消ScheduleBarWindow等待加载窗口提示的显示。
Dispatcher.BeginInvokeShutdown关闭消息泵的处理流程,同时关闭了显示窗口。
posted on
浙公网安备 33010602011771号