至于集团的采纳是C/S架构,flex的draw绘制接口以及一个第三方的绘图api

config.xml文件的配置如下:

在我们老祖宗留下的具备遗产中,最让我慕名的是这充满灵性的什么的太极八卦图。黑白的阴阳鱼,完美的组成一个园,代表着万事万物的阴阳轮回。

正文版权归天涯论坛和作者吴双本人共同所有。转载和爬虫必须在显要地方注解出处:http://www.cnblogs.com/tdws

        <widget label="态势标绘" icon="assetsimpact_area_over.png"
            config="widgets/esri/NewPlot/NewPlotWidget.xml" url="widgets/esri/NewPlot/NewPlotWidget.swf" />

上篇随笔中,我说了有些自己对微软智能客户端的观点,只是自己对集团应用发展进程的精晓。至于公司的利用是C/S架构,仍然B/S架构,依然要看使用的景观,只但是在网络技术迅速发展从前,C/S架构是拔取的主流,而到网络时代,B/S架构取代C/S架构成为主流,已经是不争的真相。其实历史就像一个循环往复,进入2010,或许大家会意识,大家又将跻身一个新的一时了!

半年前翻译了一文山会海很不好的异步编程著作,用异步的常用语来说:”在将来的某部时刻“
我还会再也翻译Async in
C#5.0 http://www.cnblogs.com/tdws/p/5617242.html

源代码目录如下:

先说说自家对瘦客户端的知情。

 写在后面 

图片 1

当自家在一台配置为两颗4核CPU和16G内存的DELL
2950服务器上,用基于微软的Hyper—V 2008
Server的4个虚拟机搭建集团测试环境的时候,偶尔会回想20年前我的大学生活,想起这时候上总括机课的气象。这时的微处理器课象平时的高数和马列没多大分别,基本都是教员在讲台上讲天书,不是Basic语言,就是Fortran。唯一的歧异是好久会有排上三回上机课,我用过的最早的微机是紫金Ⅱ,一种只好运行Basic语言的机械,程序都是用打孔机打在纸带上;再后来的好像就是终端了,一台VAX3000的主机,连接多台终端,终端好像唯有键盘和彰显器。我觉得从情理硬件上来说,这时的极端成为瘦客户端更为形象,瘦的唯有键盘和呈现器了!到了毕业设计的时候,终于用上了IBM
PC,内存为640K的处理器,教师的286被用作宝贝,唯有和睦专门相信的大学生才给用。其实我其实想不出这时会有什么的服务器端的使用,只是记忆大家的老讲师好像用Fortran编写了一个拍卖实验结果的次第,好多的温度传感器连接在一段火箭引擎的固体燃料上,点火点火后先后收集数据并生成一个点火模型,说是在的,那些程序如同固体燃料点火时长达几十米的灯火发出的啸叫,同样让我激动不已。

  图片 2

界面效果:

到了windows
NT的公布,微软才好不容易进入了网络时代,当Windows95彻底取代了DOS系统,使得PC有了一定的计量能力时,各类桌面的行使如长江沙数。印象中九十年代初期最火的是由Dbase演化而来的福克斯(Fox)(Fox)Base,各个基于FOXBASE的数据处理程序如财务等,风靡一时。记得自己曾在93年时用了10天的光阴看完了DbaseⅢ编程一书,然后使劲20天的业余时间,写了一个甩卖生产报表的次第,并随后想通了往日在高校总也学不会的Basic和Fortran语言,然后再不学编程语言。其时的行使,大多集中在拍卖特定的政工上,运行在一个个的IBM
PC上,或许此刻的使用,可以称之为胖客户端,因为根本就不设有服务器端。

     
 异步编程在拍卖并发方面被利用的尤为多,之所以说地点一句话,是为着区别多线程编程。各位驾驶员都晓得,实际上异步编程的骨干目的正出现处理。可依然平常有局部令人倍感很不得已的布道和问题,比如说,异步编程能提升运用性能吗?他能收缩我处理任务的光阴啊?他围堵线程吗?假若不打断线程,断点为啥不连续向下实施,我的哥!线程释放到何处去了?我都读书少你别骗我,线程都放出了先后怎么运行?前台我用了Ajax,后台使用Async有必不可少吗?也许如果作为司机的你看看最后一个题材,你只好摊手┑( ̄Д
 ̄)┍。

图片 3

随着技术的进化,音信化的需要也越来越高,最优秀的要求是财务的电算化。财务系统的纷繁决定了概括的客户端的采纳无法化解所有的题目,由此需要运算能力更高的硬件,于是有了服务器,于是有了B/S架构的利用。大旨的拍卖放在服务器端举行,部分的盘算还在客户端。当时硬件的推断能力,决定了C/S架构的运用,是力所能及最合情合理选择统计资源的最优的化解方案,服务器端和客户端都肩负相应的精打细算工作,在性质上也是一种平衡。

 多线程场景了解

粗粗的笔触如下:利用arcgis api  for
flex的draw绘制接口以及一个第三方的绘图api
PlotAPI4flex,来绘制各类箭头以及多方形、圆形等图形,文本和图表的绘图用的是arcgis
api。

互联网的长足发展,使得集中统计和集中储存成为一种主流的需求,应为这种模式可以最大限度的骤降客户的整体拥有资产,
而且服务器硬件技术和存储技术也在此期间高速的开拓进取,也为基于B/S架构的运用提供了物理的保证,于是才有了蜂拥而上的IDC,提供各类各样的半空中租用和联网服务,在让更多的人感受消息爆炸的同时,也多亏宣告,公司应用正式进入了B/S的时代,同时也昭示了瘦客户端时代的过来。

图片 4兴许在好啥时候刻,你想提升应用程序执行进度,尽快得到一个结果。这多少个时候,应该选取的绝对不是Async和Task。打个比方说,你和你老婆周末去超市购物,刚一进超市门你发觉结账的每条队伍容貌都几十人,于是你用到了多线程,你去排队,一个人一个人的往前走,你老婆在另一头赶紧购物,在您快走到收银台的时候,你妻子来把购物车推给了你,于是你们一贯结账回家。虽然那种行为很不文明,但这就是多线程,和异步编程一点涉嫌都并未。

NewPlotWidget.xml:配置统计周长和面积的单位音信等等

B/S的时代意味着,只要有个能够对接到网络的顶点,无论终端的总计能力怎么着,哪怕是无盘工作站,都得以相当容易的举行各类运算,处理千头万绪的业务。瘦客户端最卓绝的施用莫过于银行和杂货店的终极(不过我不懂开发,没有考证此类应用属于哪个种类结构)。

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <geometryservice>http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer</geometryservice>
    <spatialref>4326</spatialref>
    <distanceunit>千米</distanceunit>      
    <areaunit>平方公里</areaunit>  
    <showMeasurements>显示测量结果</showMeasurements>    
    <perimeter>周长:</perimeter> 
    <arealabel>面积:</arealabel>

</configuration>

在B/S基本一统天下的年份里,PC的精打细算能力也在时时刻刻的升级换代,微软着力落实了每家都有处理器的冀望,但是当下的盖茨揣度没有想到,现在每个家庭的总计机,几乎都改成了一个上网聊天看音讯的工具,可以采用电脑本身统计能力的施用,就只剩下了各样各类的游艺了。这类似和盖茨当年的愿望有点背离啊,估算盖茨同学当年的雄心是让每台电脑去承担些更伟大更有意义的行事!

 异步编程场景明白

NewPlotWidget.mxml:

万事万物都是一个循环往复,当瘦客户端发展到00年份的先前时期,大量的客户端资源被弃置,于是才会有网格总括之类的想法。RIA号称富互联网拔取,在我看来是瘦客户端的矫枉过正,是B/S架构和C/S架构融合的起初。进入二零一零年份,微软的Widows7已经昭示,Silverlight也到了第四版的Beta,在微软具备的产品中,任何一个成品都尚未Silverlight这样的开销进度。基于相同底层的Silverlight和WPF的登时的提高,用客户端的技艺将Web展现的更是丰硕多彩,我们也不禁的尾随微软的步伐,跨入了一个RIA的一时,或许几年未来,甚至是后日,大家再也不用探讨你的接纳是B/S架构,依然C/S架构,统统都叫作RIA吧。

图片 5这异步编程是咋样动静,能迎刃而解哪些问题吧?你和你老婆开了一家面包店,在最初只有你俩为消费者服务。没悟出新店开张这么火,每分钟来一个主顾,而烤好一份面包需要两秒钟。每来一位顾客你都拿着一片面包去后厨烤箱烤,并且你要和您太太要花两分钟来等分头的烤箱完成任务。但是您等待的这两分钟,又来了两位顾客,着这样的速度下去,根本不可能知足消费者们的急需呀!你已经发现你和你妻子的题材了:那就是您和您爱人这两条线程,都被烤箱花费的时日阻塞了!

大概的叙说一下思路好了

图片 6您和您太太为了缓解阻塞的题材,又买了两台烤箱,并且为了制止新进买主没人服务,每当你把面包送进烤箱后,标记其属于哪位顾客后即时赶回,准备接待新的消费者,再有消费者光临,立马接待,并将新的面包送进另一个烤箱并标记,并立时回去等待为其别人服务。在面包烤好后,烤箱会以“叮”一声,注目的在于这一信号到达后,并不是迟早要你去后厨烤箱取面包,而是你和您爱人谁不忙何人去取。这样处理后,高并发的顾客量,对你来说就映现一箭穿心了。你和您太太做为两条线程,能够不断地以非阻塞的款式(不等烤箱),再次回到到消费者面前。不过需要小心的是不打断的定义,他不是让您的顺序继续向下举办。就烤面包而言你的一个烤面包方法是这样的:

1.响应绘制的轩然大波,要激活draw工具:

1.送入面包到烤箱 2.烤箱处理面包并给你结果
3.得到面包送到消费者。所以说“不封堵”的定义,无法让你直接完事第三步。在不封堵期间,是尚未线程在您的这多少个艺术中的,那么些艺术依旧要按照时间等待,等待在以后某个时刻的信号指示你依旧你妻子,此时该办法恢复生机执行。所以说程序执行的年华仍旧不变,得到优化的是拍卖并发的力量,你店里(服务器)的吞吐量。图片 7

            //集成后的标会响应函数            
            private function activateDrawTool(event:MouseEvent):void
            {
                    this.drawToolbar.deactivate();
                    graphicsLayer.visible=true;                        
                    selectedDrawingIcon =BorderImage(event.currentTarget);
                    clearSelectionFilter();
                    selectedDrawingIcon.filters = [ glowFilter ];

                    finishDrawing = false;
                    showMeasurements = false;
                    drawType = selectedDrawingIcon.name;    

                    borVisibleChange(selectedDrawingIcon.id);

                    switch (drawType)
                    {

                        case DrawTool.POLYLINE:
                        {
                            addingPlot=false;                        
                            drawingPolygon = false;
                            drawingLine = true;
                            showMeasurements = true;

                            outlineColorId.visible=false;
                            outlineColor.visible=false;

                            drawStatus = drawLineLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, lineSymbol, drawEnd);
                            break;
                        }
                        case DrawTool.FREEHAND_POLYLINE:
                        {
                            addingPlot=drawingPolygon =false;                            
                            drawingLine=showMeasurements = true;

                            outlineColorId.visible=false;
                            outlineColor.visible=false;                    

                            drawStatus = drawFreehandLineLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, lineSymbol, drawEnd);
                            break;
                        }                            
                        case DrawTool.POLYGON:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawPolygonLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.EXTENT:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawExtentLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.CIRCLE:
                        {
                            addingPlot=    drawingLine = false;
                            drawingPolygon = showMeasurements = true;        

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawCircleLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);                            
                            break;
                        }
                        case DrawTool.FREEHAND_POLYGON:
                        {
                            addingPlot= drawingLine = false;
                            drawingPolygon =showMeasurements = true;

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            drawStatus = drawFreehandPolygonLabel;

                            this.drawtool.deactivate();    
                            setMapAction(drawType, drawStatus, fillSymbol, drawEnd);
                            break;
                        }    
                        case DrawTool.MAPPOINT:
                        {    
                            this.addingPlot=drawingPolygon =drawingLine = showMeasurements = false;                        
                            this.addingText=true;
                            drawStatus = drawMapPointLabel;            

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            this.drawtool.deactivate();                            
                            setMapAction(drawType,drawStatus,null,drawEnd);                        
                            break;
                        }
                        default:
                        {
                            //响应态势标会
                            drawingPolygon =drawingLine = showMeasurements = false;                        
                            this.addingPlot=true;    

                            outlineColorId.visible=true;
                            outlineColor.visible=true;

                            this.setMapAction(null,null,null,null);
                            var outline:SimpleLineSymbol=new SimpleLineSymbol("solid", this.outlineColor.selectedColor, this.customAlpha.value, 1);                
                            drawtool.fillSymbol=new SimpleFillSymbol("solid", this.fillColor.selectedColor, customAlpha.value, outline);        

                            this.drawtool.activate(drawType);    


                        }


                    }

            }

 看着代码了然

2.制图完事后的终结事件,获取geometry等信息,分别判断是属于哪一类别型(点、线、面等等),然后转换graphic,添加在地图上出示出来

 异步编程应当被适用于IO密集型场景,非CPU统计密集场景。我们清楚线程受CPU调度,如果您是四核CPU,那么在你的线程池中,拥有六个线程,进程每个虚拟CPU分配一个线程的时候,性能表现会最棒。既能高效使用CPU,又不要来回切换上下文损耗性能。你想想,CPU密集的情形中,CPU就是要占有你的线程,在这几个时候异步编程没有其它用处。然则在IO场景中,文件IO由win32用户形式的API到windows内核情势,在根本情势中操作磁盘驱动程序。这里面,你的线程阻塞在驱动程序的响应中。而异步编程中,你的操作公告到磁盘驱动程序后,线程立刻赶回而非等待,在将来的某个时刻,驱动程序处理终结,处理结果放入CLR线程池队列中,苏醒状态机,线程池中任意线程取出结果,方法继续向下举办。在网络IO中也是这么,只可是驱动程序变成了网络驱动程序。请看如下代码:

            private function drawEnd(event:DrawEvent):void
            {

                finishDrawing = true;
                this.drawtool.deactivate();
                this.setMapAction(null,null,null,null);

                selectedDrawingIcon = null;
                clearSelectionFilter();
                event.target.deactivate();
                var outSR:SpatialReference = new SpatialReference(102113);
                var geom:Geometry = event.graphic.geometry;

                lastDrawGraphic = new Graphic(geom);            

                if(addingPlot==true)
                {

                    var outline:SimpleLineSymbol=new SimpleLineSymbol("solid", this.outlineColor.selectedColor, this.customAlpha.value, 1);                
                    lastDrawGraphic.symbol=new SimpleFillSymbol("solid", this.fillColor.selectedColor, customAlpha.value, outline);        
                    this.drawtool.deactivate();

                }                
                else
                {                
                    switch (geom.type)
                    {
                        /*   case Geometry.MAPPOINT:
                        {
                            //文本标会就是对点的symbol进行了修改
                            if (txtLabel.text == "")
                                return;
                            var text:String=txtLabel.text;
                            var color:uint=cpText.selectedColor;
                            var font:String=textFont.selectedItem.font;
                            var size:Number=numTextSize.value;
                            var textFormat:TextFormat=new TextFormat(font, size, color, bold.selected, italic.selected, underline.selected);                            
                            var textSymbol:TextSymbol=new TextSymbol(text);
                            textSymbol.textFormat=textFormat;                             
                            lastDrawGraphic.symbol=textSymbol;     
                            break;

                        }   */
                        case Geometry.POLYLINE:
                        {
                            lastDrawGraphic.symbol = new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, 6);
                            if (chkMeasurements.selected)
                            {
                                var param:ProjectParameters=new ProjectParameters();
                                param.geometries=[geom];
                                param.outSpatialReference=outSR;
                                geometryService.project(param);
                                var polyline:Polyline = geom as Polyline;
                                measurePt = polyline.extent.center;
                            }
                            break;
                        }
                        case Geometry.POLYGON:
                        {

                                lastDrawGraphic.symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, outlineColor.selectedColor, 1, 2));
                                if (chkMeasurements.selected)
                                {
                                    var param:ProjectParameters=new ProjectParameters();
                                    param.geometries=[geom];
                                    param.outSpatialReference=outSR;
                                    geometryService.project(param);
                                    var polygon:Polygon = geom as Polygon;
                                    measurePt = polygon.extent.center;
                                }
                                break;


                        }
                        case Geometry.EXTENT:
                        {
                            lastDrawGraphic.symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID, fillColor.selectedColor, customAlpha.value, new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID, outlineColor.selectedColor, 1, 2));
                            if (chkMeasurements.selected)
                            {
                                var param:ProjectParameters=new ProjectParameters();
                                param.geometries=[geom];
                                param.outSpatialReference=outSR;
                                geometryService.project(param);
                                var extent:Extent = geom as Extent;
                                measurePt = extent.center;
                            }
                            break;
                        }
                    }
                }

                //添加删除要素监听事件
                lastDrawGraphic.addEventListener(MouseEvent.CLICK, onGraphicClick);

                graphicsLayer.add(lastDrawGraphic);                 
                onePlanGraphics.addItem(lastDrawGraphic);
                savePlanBtn.enabled=true;            

            }    
public static async Task<string> DoSomeAsync()
        {
            using (var client = new HttpClient())
            {
                var result = await client.GetAsync(
                    "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser")
                    .Result.Content.ReadAsStringAsync();
                Console.WriteLine(result);
                //做一些其他操作
                var res = 1 + 1;
                //----------------
                return "";
            }
        }

3.投影结果函数,统计周长和面积等音信

在编译的时候,DosomeAsync会被编译成一个动静机方法,状态机是哪些先别管,你可以把它当成一个黑盒子。在遇见GetAsync的时候,在DoSomeAsync中回到一个Task任务目的,并由await在Task对象上传递用于苏醒状态机的办法,相当于调用了ContinueWith().这么些艺术顾名思义,以xxx继续。然后线程从DoSomeAsync中回到。重返后干嘛去了?该线程可以去处理其他工作了。在今日某一时刻,服务器向我们发送了一个对应,网络驱动程序得知请求完毕,復苏该情势继续执行剩下的此外代码。配一张乱糟糟的图

            //使用GeometryService计算距离和面积等响应
            private function projectCompleteHandler(event:GeometryServiceEvent):void
            {
                var geom:Geometry = (event.result as Array)[0];
                var lengthsParameters:LengthsParameters = new LengthsParameters();
                var areasAndLengthsParameters:AreasAndLengthsParameters = new AreasAndLengthsParameters();
                switch (geom.type)
                {
                    case Geometry.POLYLINE:
                    {
                        var pLine:Polyline = Polyline(geom);
                        lengthsParameters.geodesic = true;
                        lengthsParameters.polylines = [ pLine ];
                        geometryService.lengths(lengthsParameters);
                        break;
                    }
                    case Geometry.POLYGON:
                    {
                        var pGon:Polygon = Polygon(geom);
                        areasAndLengthsParameters.polygons = [ pGon ];
                        geometryService.areasAndLengths(areasAndLengthsParameters);
                        break;
                    }
                    case Geometry.EXTENT:
                    {
                        var extent:Extent = Extent(geom);

                        // convert it to a polygon for measurment
                        const arrPoints:Array = [
                            new MapPoint(extent.xmin, extent.ymin),
                            new MapPoint(extent.xmin, extent.ymax),
                            new MapPoint(extent.xmax, extent.ymax),
                            new MapPoint(extent.xmax, extent.ymin),
                            new MapPoint(extent.xmin, extent.ymin)
                        ];

                        var polygon:Polygon = new Polygon();
                        polygon.addRing(arrPoints);
                        polygon.spatialReference = extent.spatialReference;

                        areasAndLengthsParameters.polygons = [ polygon ];
                        geometryService.areasAndLengths(areasAndLengthsParameters);
                        break;
                    }
                }
            }

            private function arealengthsCompleteHandler(event:GeometryServiceEvent):void
            {
                var area:Number = event.result.areas[0]; //event.arealengths.areas[0];
                var length:Number = event.result.lengths[0]; // or (event.result as Array)[0]; //event.arealengths.lengths[0];

                var label:String = "面积:" + numFormatter.format(area/1000000) + "平方千米";
                label += "\n" + "周长:" + numFormatter.format(length/1000) + "千米";
                addDrawLabel(label, lastDrawGraphic);
            }

            private function lengthsCompleteHandler(event:GeometryServiceEvent):void
            {
                var length:Number = (event.result as Array)[0];

                var label:String = "距离:" + numFormatter.format(length/1000) + "千米";
                addDrawLabel(label, lastDrawGraphic);
            }

图片 8

备注:

 

GIS技术交换QQ群:432512093

 额外的益处

WebGIS二次开发培训入门群: 238339408

 在GC的垃圾堆清理实施进程中,应用程序的具备线程都会被挂起,使用异步编程意味着在同样的并发量下,你可以使用更少的线程来形成处理,额外带来的裨益就是,所急需清理的线程是更少的。还有一些就是,所运用的线程少了,CPU线程切换也变得更少。

 

万一我的简单分享对您有点滴援助,欢迎点击下方肉色按钮关注,我将不断输出分享。也欢迎为我也为你协调点赞。

正文关键字,C# ASP.NET 异步编程 MVC Async await

相关文章