WPF中多线程技术日记(一)

这几天一直在接触 多线程和异步的概念,很多时候会被混为一谈,我在原来开发的HDD软件上做了个实验,同时应用了多线程和异步两种技术,有助于理解二者的区别。
我希望实现的功能是:
1、主程序在启动某项计算功能后(该计算功能可能像Ansys一样耗费很长时间),仍然可以对HDD界面进行其他的操作;
2、当该计算执行完毕后,通知主程序进行后处理(比如Ansys的应力云图神马的) ;

开始的时候我是希望一个多线程结束后会激发一个事件,然后在事件处理器中进行后处理,但似乎没有找到类似的事件,扒了好半天,有人建议说用Socket,我表示:俺不是作通信的!对Socket确实不了解。
搜索到的第二个方案我觉得比较合适:异步回调。也就是说让程序异步执行一个函数,在该操作结束时,程序会启动一个回调函数(某种意义上说就是我想要的那个事件),然后在回调函数中进行后处理。 这样就会模拟出多线程的效果来,但是这里还是有区别的:如果我在异步执行的函数中再加入多线程语句,那么回调函数并不会等待这几个线程结束就已经执行了,就会出现——计算还没结束就已经后处理了!
到现在为止都是多线程的问题,并未涉及WPF,下面就要引出一个关于WPF多线程中的问题:绑定+通知Xmal更新。在多线程中,我们希望处理的数据可以更新到UI中,但是WPF的UI只运行主进程修改,故而子线程在进行修改绑定数据并RaisePropertyChange的时候就会报错:Must create DependencySource on same Thread as the DependencyObject。那么这个时候该怎么办呢?我找了CSDN中的大牛的一个方案,我觉得比较简单:把绑定的数据Freeze掉后再
RaisePropertyChange,就ok了,冻结的属性,允许支线程更新绑定。有趣的是,并非所有属性都会遇到这个问题,比如Array、DataTable啊,Lsit的啊,它们甚至根本就没有Freeze的功能,不冻结,也不会报错,我估计是因为这些类型太低级?原因待查!
 我已经将单核计算用异步做好了,现在就是讲多核计算部分用多线程重构了。

你可能感兴趣的:(语言学习)