.net 利用委托和线程解决窗体假死
利用线程解决窗口假死
基本理论:
1,.net2.0以后,CLR默认不允许以非UI线程访问控件。
在Framework1.x中,CLR允许应用程序以跨线程的方式运行,而在Framework2.0及以后版本中,System.Windows.Form.Control新增了CheckForIllegalCrossThreadCalls属性,它是一个可读写的bool常量,标记我们是否需要对非UI线程对控件的调用做出检测。如果指定true,当以其他线程访问UI,CLR会跑出一个”InvalidOperationException:线程间操作无效,从不是创建控件***的线程访问它”;如果为false,则不对该错误线程的调用进行捕获,应用程序依然运行。
窗体阻塞分为两种情况。
1,一种是在UI线程上调用耗时较长的操作,例如访问数据库,这种阻塞是UI线程被占用所导致,可以通过delegate.BeginInvoke的异步编程解决;
2,另一种是窗体加载大批量数据,例如向ListView、DataGridView等控件中添加大量的数据。
多线程和异步:
异步和多线程是练个概念
多线程是多个任务同时处理。
异步值得是:例如:A在买东西,B店员需要去拿东西给A看,这个时候可以A继续看东西,而B去拿东西.等待B拿到后通知A.这个过程A是可以继续工作,在B完成后通知A。异步的实现还是依赖于多线程,因为有异步回调。
异步回调: