快速业务通道

浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础 上

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
leep(1000);
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < 10000; i++)
     sb.Append("test");
   string s = sb.ToString();
   BeginInvoke(new Action(() =>
   {
     textBox1.Text = s;
   }));
}).Start();

好像效果上还是没什么区别,那么Invoke和BeginInvoke的区别在哪里呢?

我们知道Windows应用程序基于消息,Windows API提供了SendMessage和PostMessage两个API,前者执 行消息后返回(不经过消息管道,先于PostMessage执行),后者把消息发送到管道异步执行。Invoke和 BeginInvoke从行为上来说类似这两个API,但是实际上两者都使用了PostMessage,前者使用信号量在消 息执行前阻塞,达到同步的效果。我们来做一个实验:

new Thread(() =>
{
   Thread.Sleep(1000);
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < 10000; i++)
     sb.Append("test");
   string s = sb.ToString();
   Stopwatch sw = Stopwatch.StartNew();
   Invoke(new Action(() =>
   {
     textBox1.Text = s;
   }));
   MessageBox.Show(sw.ElapsedMilliseconds.ToString());
}).Start();

运行程序:

可以体会到,在文本框的值出现之后才出现弹出框,文本框赋值这个消息的执行过程耗时2秒。把 Invoke改为BeginInvoke其它不动再执行程序:

明显感到弹出框先显示2秒后文本框的值出现。BeginInvoke没有阻塞后续语句的执行。因此,需要注 意,如果我们在方法中使用的变量在 BeginInvoke之后有修改,极有可能发生混乱。如果您使用过委托的 BeginInvoke应该会知道,通常建议总是调用EndInvoke来回收资源,对于Control的EndInvoke来说,如果 您不需要获取返回值的话,那么它不是必须的(来自msdn)。

现在您可能还有疑问为什么使用了BeginInvoke,UI还是卡了大概2秒,可以这么理解,我们把这么多 的文字赋值到文本框中,这个UI行为是非常耗时的,不管是Invoke还是BeginInvoke最终是发送消息给UI 线程处理(两者都没有使用线程池),它就是需要这么多时间,在一般情况下我们不会在UI上呈现这么多 数据。

一般来说我们能做的优化是:

1) 尽量把非UI的操作使用新的线程去异步计算,不阻塞UI线程,真正需要操作UI的时候才去提交给 UI线程

2) 尽量减少UI的操作复杂度,比如如果需要在UI上绘制一个复杂图形可以在内存中先创建一个位图 ,绘制好之后把整个位图在UI上绘制,而不是直接在UI上绘制这个图形

举个例子,UI就好象一块画布,我们要在上面画一个巨作怎么才能不过多占用这块布的时间,让大家 都能用上呢?一个方法就是我们在准备颜色和画笔的时候不占着这个布,真正要去画的时候才去用,另外 一个方法就是在另一块画布上先画,然后把图案采用复印的方式印到我们的主画布上。

对于大量数据的呈现,我们还可以:

1) 采用分页,只显示一部分数据,对于Windows程序的分页可能就是滚动条性质的了,在滚动条下拉 的时候再去呈现当前“页”的数据

2) 即使是一页的数据,也可以一部分一部分呈现

举个例子,对于word文档的加载一般我们一打开就可以看到第一页,然后滚动块慢慢变小,页数慢慢 增多,如果一开始就加载1000页的话我们可能要1分钟后才能看到第一页,如果等不及直接向后翻滚动条 的话会立即加载后面的数据:

new Thread(() =>
{
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < 100; i++)
     sb.Append("test");
   string s = sb.ToString();
   for (int i = 0;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号