微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight 大量渲染假死问题

     很是不能原谅自己这个冬天的随意和懒惰,曾经坚持写日志的习惯就这么恍然间就那么戛然而止。又是岁末年初的时候,记得2011年是多么翘首以待的时刻,如今已到年末了。真的不知道2011年这一年会在我的生命中留下什么,回头望去,好像自己都是那么一路蹒跚的走过一年,真的好像是一无所获。.......

    总感觉自己所学习的零零散散的,我也没有那种毅力和习惯坚持去写技术日志。但是经常会看一些技术日志却觉得人家写的很好,很多时候都是对自己的技术难题有些启示。当然写技术日志也是梳理自己思路的问题,当然记忆和理解都会深刻一些。唉2011年就这么结束了,应该在2012年有个新的状态。以后尽量多写些技术日志,来记录自己学习的历程。
--------------------------------------------------转载------------------------------------------      Silverlight中 非UI线程更新UI 的几种方法:Delegate,Asyncoperation,BackgroundWorker  
首先列一下基础代码
 
 
 
  1. <UserControl   
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  4.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"   
  5.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
  6.     mc:Ignorable="d"   
  7.     x:Class="Shareach.TestUI.UCThreadUpdate"   
  8.     d:DesignWidth="250" d:DesignHeight="120">   
  9. <StackPanel>   
  10. <TextBlock x:Name="txtCalc" />   
  11. </StackPanel>   
  12. </UserControl> 
  13. using System;   
  14. using System.Windows;   
  15. using System.Windows.Controls;   
  16. using System.Windows.Documents;   
  17. using System.Windows.Ink;   
  18. using System.Windows.Input;   
  19. using System.Windows.Media;   
  20. using System.Windows.Media.Animation;   
  21. using System.Windows.Shapes;   
  22. using System.Threading;   
  23. namespace Shareach.TestUI   
  24. {   
  25.     public partial class UCThreadUpdate: UserControl   
  26.     {   
  27.        public UCMsgSend()   
  28.        {   
  29.               InitializeComponent();   
  30.               ThreadUpdate();   
  31.        }   
  32.        void ThreadUpdate()   
  33.        {   
  34.              Thread thread = new Thread(new ThreadStart(DoWork));   
  35.               thread.Start();   
  36.        }   
  37.        void DoWork()   
  38.        {   
  39.               int i=0;   
  40.               while(i<100){   
  41.                      DoShow(i);    
  42.               }   
  43.        }   
  44.     }   
  45. }  
  46. DoShow的三种写法    
  47. 1. delegate   
  48.  
  49. void DoShow(i){   
  50.     this.dispatcher.BeginInvoke(   
  51.                             delegate {   
  52.                                    txtCalc.Text = string.format(“result “{0}”,i);   
  53.                             });   
  54. }  
  55. 2.Asyncoperation   
  56.  
  57. void DoShow(i){   
  58.     //这个可以写成成员变量,我这里只是为了好区分   
  59.     System.ComponentModel.Asyncoperation asyncoper = System.ComponentModel.AsyncoperationManager.CreateOperation(null);   
  60.     asyncoper.Post(result =>   
  61.             {   
  62.                 txtCalc.Text = string.format(“result “{0}”,i);   
  63.             }, null);   
  64. }  
  65. 3.BackgroundWorker   
  66.  
  67. 参考MSDN上的文章的  
  68. Winform 也一样, 
  69.  
   BackgroundWorker是属于后台线程 ,不能操作前台
--------------------------------------------------转载------------------------------------------    以前所做的都是在地图上临时创建一个Graphicslayer图层,当然只添加很少的Graphicslayer(MapPoint、Line、polygon),当然涉及不到性能的问题。一般情况下不超过5000个Graphic是没有什么问题的,起码操作地图的时候感觉不到慢。可是已超过5000个,就会明显感觉很慢,甚至出现假死的现象。由于好多都是封装好的,我们没有办法去修改,所以要解决此类问题就必须换种思路。由于ArcGIS在GIS行业做的是属于比较成熟的,所以相关的问题都有解决问题,只是我们自己熟练程度的问题。对于这个假死的问题,查了很多资料解决方案有一下几种:
 在服务器端进行点抽希是根本解决办法。两个方法可以进行点抽希:
1、从服务器端拿到图形后,自己在用geometry service的generalize方法抽希;
2、如果是gp服务,在服务器端对结果用generalize工具进行抽希;

另外,可考虑将此graphic放在单独线程里添加到graphicslayer上去,不至于阻塞ui线程。
   类似这类问题能在服务端就在服务端,不然真的很慢。上面的两种我尽管知道抽希的大概意思,但是真的不知道怎么去操作,之后用的是第三种,感觉没有假死,但是还不是很快,再想想还有没有其他的方式,还考虑在服务端GP生成结果返回一张图片 不过未实现过。
   不过今天看到一个非GIS人写的项目总结,可以考虑将那些点数据生成XAML文件,之后通过Silverlight去解析。这样性能或许会快一些。但是他说的是在Canvas上画图,我想想能不能生成shp文件,之后根据shp文件创建一个图层去显示,这样才符合GIS 的空间思维,不然感觉有些别扭,还有一种是通过GP生成栅格数据,在客户端叠加。思路上应该没有什么问题,可行。
  先记下这些问题,之后完善。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐