ASP.NET网页编程之WinForm程序中利用把持台作为输入窗口
实不相瞒,Java是我见过的执行效率最低的程序设计语言,前不久在CSDN论坛上有个评测,计算9999的阶乘,同样的循环算法,Java的耗时是.NET的5倍。Lambda表达比代表界说和带外办法界说的分离更分明,且相干的分外事情只必要满意言语界说便可。不外,它也有一些不敷的地方。假如某个办法的参数包括System.Delegate如许的笼统范例,用lambda表达式先容特别的成绩:C#编译器不克不及将lambda表达式转换成还未明白界说的衍生代表范例。假如不细心思索一下,你的代码看上往就会像是来自.NET1.0的器材。在本文中,我将告知告知你为何lambda表达式不敷以被间接转换成笼统代表范例,而且教你如何使得编译器转换你所界说的指定代表。办理计划依附于WindowsPresentationFoundation(WPF)和System.Windows.Threading.Dispatcher组件,可是严厉意义上说,该成绩不是一个WPF成绩。文中所形貌的成绩呈现在多少.NET框架中,包含WindowsForms,Office使用程序接口和映照使用程序接口。你能够依照以下办法来处置同类成绩。不管我甚么时分利用.NET框架中带有来自代表表格的参数的使用程序接口,我城市偏向于利用lambda表达式而不是更具体的表达式。比方,这行代码创立了一个System.Windows.Threading.Timer,在计时器生效时,该代码挪用了一个TickHandler办法:
以下为援用的内容:
tick=newSystem.Threading.Timer((unused)=>TickHandler());
假如办法的内容充足少,我就会用办法的内容替换TickHandler()办法挪用。该办法年夜多半情形下都无效,可是当使用程序接口将System.Delegate作为参数时,这一技能不论用。比方,我们将System.Windows.Controls.Dispatcher.Invoke()办法穿过WPF中的线程实行挪用:
以下为援用的内容:
publicobjectInvoke(delegatemethod,paramsobject[]args)
如今思索一下当我们实验用lambda表达式来实行如许的挪用时,将会产生甚么:
以下为援用的内容:
MyTime.Dispatcher.Invoke(()=>DoSomething());
会呈现秘密毛病:
以下为援用的内容:
errorCS1660:Cannotconvertlambdaexpressionto
typeSystem.Delegatebecauseitisnotadelegatetype
也许第一次看到这个毛病的时分,你还不晓得究竟是怎样一回事。固然,这切实其实是一个代表范例。编译器不像人一样的天真。System.Delegate范例是一个笼统范例,且该范例的推理工具不克不及揣度出自变量或某些用于未知代表范例的前往值的数目和品种。要办理这一成绩,我们必需创立一个详细的代表范例并为该范例指定lambda表达式。记着,代表范例请求你将办法视为数据。
我创立了一个WPF计时器程序来展现其事情道理,个中论述了C#3.0如何简化与老式使用程序接口(下图)的运转。
当你做演示的时分,该示例中的使用程序运转了一个计时器,跟着设准时间流逝,它的色彩会从绿色转为黄色再转为白色。这是一个很好的演示跨线程挪用的办法,由于该计时器在背景线程中运转。
依照工夫的改动来更新演示请求对出自计时器的事务作出呼应。计时器在背景线程中运转,以是你会很容易地犯我们在后面提到过的毛病。
更新使用程序
用户界面处置的是复杂代码。当计时器生效时它会失效,并且代码会更新计时器的显现。这一更新必需改动文本,或把持背景。以下所示:
以下为援用的内容:
MyTime.Background=newBrush;MyTime.Content=label
计时器在背景线程上运转,以是你必要经由过程利用Dispatcher.Invoke()界限线实行挪用。这两行代码是你想列进lambda表达式的代码,不是证实办法界说的逻辑来由。可是我之前就讲过lambda不会与Didpatcher.Invoke一同运转,除非是你利用了详细的代表界说才行。这当中的一部分已在.NET框架3.5中界说了。
我们可使用嵌进式代表界说并对它们举行分派,这些都是的该办理计划比起先条件到过的案例都要费事一些。这两行代码也请求一对参数:一个用于文本的字符串和用于背景色彩的色彩刷。这意味着你必要利用的代表界说要思索到这两个参数并前往有效值:
ActionupdateTimer;
在声明变量后,你能够为代码指定必要实行的代表变量。这里你可使用lambda表达式,由于Action是一个详细的代表界说:
以下为援用的内容:
updateTimer=(label,newBrush)=>{MyTime.Background=newBrush;MyTime.Content=label;};
如今,当计时器提失事件时,你已具有了一些必要实行的指向该代码的变量。接上去要做的就只是经由过程Dispatcher.Invoke()利用代表界说:
以下为援用的内容:
if(!MyTime.Dispatcher.CheckAccess()){MyTime.Dispatcher.Invoke(updateTimer,newLabel,next);}elseupdateTimer(newLabel,next);
这一历程非常复杂,可是却请求你重复举行,因而,我们可让步骤变得简单一点。
这里实在由一个复杂的形式。事务处置器能够从背景线程中挪用出来。当我们利用计时器,大概异步伐用Web服务和其他相似义务的时分,你就会看到这一举动。不管是在甚么时分,我们都不分明本人位于哪一个线程之上,我们能够挪用Dispatcher.CheckAccess()来决意是不是能够会见恣意用户界面控件。假如必要从线程界限实行挪用,就必需利用Dispatcher.Invoke()。Dispatcher.Invoke()办法制止了因为利用了办法参数的参数数组而酿成的多少超载成绩。它利用的是一个我们想要实行的笼统代表范例。
你想要一个能反省是不是必要收拾编排的单一办法。假如必要,则办法会编排好挪用,不然,会挪用由代表指定的办法。你卖弄办法作为System.Windows.Controls.Control范例的成员呈现。如许使得你能够将代码作为控件的一部分来利用。C#3.0就为你供应了如许做的办法:扩大办法。你必要编写一些办法的分歧超载,这些使得你能够经由过程分歧的参数来利用它们:
以下为援用的内容:
publicstaticclassWPFExtensions:{publicstaticvoidInvokeIfNeeded(thisControlwidget,ActionwhatToDo){if(!widget.Dispatcher.CheckAccess())widget.Dispatcher.Invoke(whatToDo);elsewhatToDo();}publicstaticvoidInvokeIfNeeded(thisControlwidget,ActionwhatToDo,Tparm){if(!widget.Dispatcher.CheckAccess())widget.Dispatcher.Invoke(whatToDo,parm);elsewhatToDo(parm);}publicstaticvoidInvokeIfNeeded(thisControlwidget,ActionwhatToDo,T1parm1,T2parm2){if(!widget.Dispatcher.CheckAccess())widget.Dispatcher.Invoke(whatToDo,parm1,parm2);elsewhatToDo(parm1,parm2);}}
固然,我们也能够经由过程增加更多参数的体例来增加更多超载以扩大这个类。这实际上是一个复杂的扩大。
有一种办法让WPF计划师们猖狂:他们但愿用最小化使用程序接口的面积部分来简化Dispatcher工具的利用。经由过程利用笼统代表和参数列表中的参数,这一工具的利用局限被扩展了。
任何带有参数的办法都能够被拿来利用。可是,如许做有一个不敷的地方。该使用程序接口更加笼统,它会损坏一切范例的平安性,并且如许做会破坏编译器利用范例推理的才能,从而下降事情效力。必要做的应当是增加本人的平安扩大办法的层范例,这一层范例能够在范例平安挪用和更加笼统的.NET库使用程序接口之间供应一个层。
我实在想不明白java的机制,为什么非要那么蛋疼,在同一个平台下重复编译。 我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 那么,ASP.Net有哪些改进呢? 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。 asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
页:
[1]