版权声明:本文为博主原创文章,未经博主允许不得转载。
第一次发文章,水平有限,如有错误欢迎大家指出。
声明:
1,测试环境为vs2008, .net framework 3.5
2,此次我使用的Timer是 System.Windows.Forms 命名空间下的 Timer 组件,另外两个Timer我没试验。
3,我没有用工具箱添加Timer和BackgroundWorker
首先
介绍一下画面
总共有3个Form
点击第一个图标弹出下面的画面
点击第二个图标弹出下面的画面
两个画面很类似。
实现的是同一个功能。
主画面功能不详述。
先说第一个画面
利用Timer的实现机制实际上是事件(event)机制
this.timer.Tick += new System.EventHandler(this.timer1_Tick);
这一行代码是让Timer在指定时间触发一个事件
而画面定义一个方法
private void timer1_Tick(object sender, EventArgs e)
对此事件进行响应。
此响应方法是Form的线程去执行的方法,所以,在此方法内执行很耗时的操作时。画面将会出现假死现象。
例如:读数据库或者进行网络连接以及复杂运算等等。
本例采用
System.Threading.Thread.Sleep(3000);
来代替耗时操作。实际运行时出现画面没响应的现象,具体现象请下载代码实践一下。
以下是执行时输出的日志
在每次出现 “开始忙碌” 的时候画面开始假死,鼠标点击画面没反应。停止忙碌时恢复。
我们再来看看BackgroundWorker的表现
代码如下
由于backgroundworker是后台线程,所以不会出现画面假死现象。即便是
耗时操作
System.Threading.Thread.Sleep(3000);
也不会假死
所以。我建议如果有类似功能要实现的朋友要优先选择BackgroundWorker
这样可以让你的程序界面更灵活。
顺便提一句
====================================================================
以下的文字全是个人理解,很有可能与事实有偏差,欢迎指正。
====================================================================
如果说Form是一个线程,BackgroundWorker是另外一个线程。Form中的控件有可能会被禁止在BackgroundWorker的
Dowork中调用,这种调用被称为跨线程调用。如果出现这样的问题。请尝试下面的方法。
DataGridView.CheckForIllegalCrossThreadCalls = true;
DataGridView这里用的是类名而不是对象的引用
CheckForIllegalCrossThreadCalls 是 Control 类的成员
Control. CheckForIllegalCrossThreadCalls
MSDN上的说明是:获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的 Handle 属性。
改变CheckForIllegalCrossThreadCalls 的值,则可以让控件可以被跨线程操作。