GVKun编程网logo

Windows服务 – 封装现有function(服务器封装是什么意思)

14

如果您想了解Windows服务–封装现有function和服务器封装是什么意思的知识,那么本篇文章将是您的不二之选。我们将深入剖析Windows服务–封装现有function的各个方面,并为您解答服务

如果您想了解Windows服务 – 封装现有function服务器封装是什么意思的知识,那么本篇文章将是您的不二之选。我们将深入剖析Windows服务 – 封装现有function的各个方面,并为您解答服务器封装是什么意思的疑在这篇文章中,我们将为您介绍Windows服务 – 封装现有function的相关知识,同时也会详细的解释服务器封装是什么意思的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Windows服务 – 封装现有function(服务器封装是什么意思)

Windows服务 – 封装现有function(服务器封装是什么意思)

我们正在运行Winforms C#(.net framework 4.0)开发的客户端 – 服务器应用程序,它具有以下组件

客户端(Windows应用程序)

服务器(控制台应用)

我们正在研究实现服务器(控制台应用程序)作为Windows服务的可能性。

首先让我来概述一下我们决定采取的方法

创build一个Windows服务项目(使用Windows服务项目模板)

将服务器function集成/封装到Windows服务中

只有一个问题需要我们回答。 这里的尝试是尽可能客观地提出这个问题,所以可以把它归类为一个真正的问题。

Windows 8是否支持System.Device.Location?

单声道,asp.net c#和MVC如何和教程

.Net使用特殊文件夹符号

WinForm:与VS2010中的现有菜单合并ContextMenuStrip MenuItem

64位版本的Windows SDK中的Fxcop在哪里?

我们是否需要将服务器转换为一个dll项目?

或者我们可以在Windows服务项目中提供对服务器exe文件的引用?

我个人认为第二种select是不可能的。 但是我想知道我是否错过了一些东西。

预先感谢一吨

罗米

如何启用/禁用防火墙?

.Net和Hadoop – 知道/学习什么和可用的?

Windows应用程序Java Servletparameter passing

任何方式立即触发WaitOne()的超时?

win32 api是否过时了?

您可以将该exe文件作为参考添加到您的服务项目中。 无论如何,EXE只是一个程序集。 也许你必须设置为公共的一些类,但是如果你创建一个DLL也会发生。 我通常使用另一个技巧。 我从一个服务项目开始,并将其更改为一个控制台应用程序:

属性 – >应用程序 – >输出类型:控制台应用程序

然后我写这样的主要内容:

if (Environment.UserInteractive) { log.Info("Starting as a console..."); // call my service runner } else{ log.Info("Starting as a service..."); log.Info(this.ServicedisplayName); log.Info(this.ServiceDescription); ServiceBase[] servicesToRun = new ServiceBase[] { new MyServiceImpl(); }; try { ServiceBase.Run(servicesToRun); } catch (Exception e) { log.Fatal("A Fatal error occurred while running.",e); throw; } }

有了这个策略,我有一个exe交互式运行,它像一个控制台,但可以安装在服务控制管理器。 也许类似的重构会帮助你的代码。

控制台应用程序可以像DLL一样引用,您可以使用它包含的公共类。

基于.NET的Windows服务本身并不特别。 您可以为两者使用相同的基于控制台的应用程序项目。 主要区别是:

在一个服务中, Environment.UserInteractive标志将是False 。 您可以使用它来根据执行方式更改程序的行为。 (例如,登录到控制台而不是Windows事件日志。)

该服务实际上不会有一个控制台 – 即,即使它是一个“控制台应用程序”,您也无法读取它。

使用ServiceBase.Run()启动ServiceBase.Run() ,必须包含服务安装程序组件 ,并使用installutil或“自行安装”进行安装 。

我会做的是创建服务器作为服务项目,遵循文档中的样板 :

class Myserver : ServiceBase { protected override void OnStart(string[] args) { // OnStart() MUST return,so spawn off a thread here } public void MyStart(string[] args) { OnStart(args); } }

您必须将项目类型更改为项目属性中的“控制台应用程序”。 服务应用程序模板的默认值是“Windows应用程序”,但似乎并不重要。 除了你应该通过安装调试服务的部分,启动它,然后附加一个远程调试器。 感谢克苏鲁,当你:

根据Environment.UserInteractive ,根据需要启动它:

public static void Main(string[] args) { if (Environment.UserInteractive) { new Myserver().Start(args); } else { ServiceBase.Run(new ServiceBase[] { new Myserver() }); } }

这样你就可以获得一个独立运行的windows服务,可以使用F5进行调试。

在dll项目中转换服务器代码,然后将该dll的引用添加到windows服务项目并在那里使用它将是个好主意。

但是,在.net中使用可执行项目的引用到另一个项目是非常可能的。

演练:在组件设计器中创建Windows服务应用程序

$(window).load(function() {})和$(document).ready(function(){})的区别

$(window).load(function() {})和$(document).ready(function(){})的区别

在我以前的开发中,一般用到javascript,我都是采用jquery的模式,也就是大多数时候,第一行写的是:

$(document).ready(function(){

...

});

这个时候,不一定要等所有的js和图片加载完毕,就可以执行一些方法,不过有些时候,必须要等所有的

元素都加载完毕,才可以执行一些方法的时候,比如说,部分图片或者什么其他方面还没有加载好,这个时候,点击某些按钮,会导致出现意外的情况,这个时候,就

需要用到:

$(window).load(function() {

$("#btn-upload").click(function(){   //比如说:
uploadPhotos();
});

});

下面是转载的内容,

用$(window).load(function(){...})而不用body.onload()的几个理由

首先它们都是在页面所有元素(包括html标签以及引用到得所有图片,Flash等媒体)加载完毕后执行的,这是它们的共同点.

不用body.Onload()理由1:

如果我们想同时加载多个函数,我们必须这样写

<body onload="fn1(),fn2()"></body>看起来极其丑陋,如果用$(window).load()我们可以这样加载多个函数

$(window).load(function() {
            alert("hello,我是jQuery!");
  });
$(window).load(function() {
        alert("hello,我也是jQuery");
});

这样写它会从上往下执行这两个函数,并且看起来漂亮多了.

不用body.Onload()理由2:

用body.Onload()不能够做到js和html完全分离,这是一个很严重的问题.

另外用$(window).load(function(){...})和body.onload()都存在同样一个问题,因为开始也说到了,它们都需要等到页面的所有内容

加载完毕才执行,但是如果当网速比较慢的时候,加载一个页面往往需要较长的时间(几秒到十几秒不等,甚至更长...),所以我们经常

会遇到页面还没有完全加载完毕而用户已经在操作页面了这种情况,这样页面表现出来的效果就跟我们预期的效果不一样了,

所以在这里我推荐使用$(document).ready(function(){}),或简写为$(function(){}),因为他会在页面的dom元素加载完毕后就执行,

而无需等到图片或其他媒体下载完毕.

但是有时候确实我们有需要等到页面的所有东西都加载完后再执行我们想执行的函数,所以是该使用$(window).load(function(){...})还是

该使用$(function(){})往往需要结合具体需要而作不同的选择.

最后附上一段在所有DOM元素加载之前执行的jQuery代码

<script type="text/javascript">

(function() {
            alert("DOM还没加载哦!");
        })(jQuery)
  </script>

呵呵,有时候我们也有这个需求!

$(window).load(function(){})和$(document).ready(function(){})的区别

$(window).load(function(){})和$(document).ready(function(){})的区别

以浏览器装载文档为例,在页面加载完毕后,浏览器会通过JavaScript为DOM元素添加事件。

在常规的Javascript代码中,通常使用 window.onload = function(){} 的方式,而在jQuery中常使用的则是 $(document).ready(function(){}) 的方式。

事实上,JavaScript原生的 window.onload = function(){} 等价于jQuery的 $(window).load(function(){}) ,而jQuery的 $(document).ready(function(){}) 则在JavaScript中没有原生对应事件。

jQuery的 $(document).ready(function(){}) 是事件模块中最重要一个函数,可以极大的提高Web应用程序的速度。但需要注意的一点是,由于在 $(document).ready(function(){}) 方法内注册的事件,只要DOM就绪就会被执行,因此可能此时元素的关联文件未下载完。例如与图片有关的html下载完毕并且已经解析为DOM树了,但很有可能此时图片还没有加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。

要解决这个问题,可以使用jQuery中另一个关于页面加载的方法——load()方法。load()方法会在元素的onload事件中绑定一个处理函数,如果处理函数绑定给window对象,则会在所有内容 ( 包括窗口、框架、对象和图像等 ) 加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。

1.执行时机不同。

JavaScript原生的 window.onload = function(){} 是必须等待网页中所有的内容加载完毕后 ( 包括图片 ) 才能执行的,因此jQuery的 $(window).load(function(){}) 也同样有着这样的特性,即必须等待网页中所有的内容加载完毕后 ( 包括图片 ) 才能执行。

而jQuery的 $(document).ready(function(){}) 是只要网页中所有DOM结构绘制完毕后就执行,因此可能DOM元素关联的内容并没有加载完。

2.编写个数限制不同。

JavaScript的onload事件一次只能保存对一个函数的引用,他会自动用最后面的函数覆盖前面的函数,因为 window.load 是DOM2级事件。

但jQuery的 $(window).load(function(){}) 却没有这样的限制,可以编写多个,根据编写的前后顺序依次执行,因为在这里jQuery的实现方式是DOM3级事件,而 $(document).ready(function(){}) 有着同样的特性。

这两种方式都能够在页面加载后去做一些事情,可以根据不同的场景选用不同的方式。

 

"后来我才知道,在很多的事情上努力都能有成效,但人与人之间的关系不行,能走到最后的其实一开始就是同路人。"

(function (window, undefined){})(window)

(function (window, undefined){})(window)

 (转)最常见的闭包 (Closure) 范式大家都很熟悉了:

123 (function() {// ...})();

很简单,大家都在用。但是,我们需要了解更多。
首先,闭包是一个匿名函数 (Anonymous function), 即是 (function () {}) 这部分。之所以要给 function 添加括弧是为了让它形成一个表达式 (expression), 有了表达式,并且确定它的类型是个函数 (Function 实例), 就可以直接调用它。所以,后面的一对括弧是可以工作的,它的意义是:我要调用 (call) 这个函数。

既然是函数调用,那就可以像一般的函数那样,在调用时传入参数。这就是本次讨论的话题。

传入 window 参数

 

123 (function(win) {// ...})(window);

这样做最直观的好处是书写便利:少写几个字。你可以在闭包内任何地方使用 win, 它都会指向 window 对象。另外,它有利于压缩减少最终代码的体积,经过压缩后 (如 Google Closure Complier), 所有的 win 都会被替换成形如 a 这样的简单变量。win 用得越多,减少的字节数也越多。

不过,便利的同时也会带来陷阱。在 IE 上,window 总是指向当前窗口对象,这个没有问题,但是在某些场景下,使用闭包内的 win 变量会导致拒绝访问错误 (Access denied). 重现方式大致是这样的:当页面引用其他域名的脚本,并且该脚本调用了闭包内的 window.document, 而且这个闭包代码是来自另一个域名的脚本。在这种情况下,使用 win 会保持对 window 最早的引用,通过另一个域的脚本访问 win 会导致 IE 认为脚本产生了跨越冲突,从而拒绝了对 win.document 的访问。解决办法是不使用形参 win, 而是直接使用 window. 需要说明的是,给闭包传入 document 也会导致 IE 出现同样的问题。

传入 undefined

其实把 undefined 作为形参就,实参就可以不用传了,因为 JavaScript 中访问未传入的参数就会得到 undefined. 因此,你可以这样写:

123 (function(undefined) {// ...})();

和上面的讨论一样,你可以在闭包内任何地方使用 undefined, 可以少写几个字(如果把 undefined 换成更短的名字),也可以在减少压缩后体积。

另一个的优势是,你可以认为它是个变量,把它当变量来使用,它的值恒等于 (===) 真正的 undefined. 当外部代码意外地定义了 undefined 的时候 —— 不常见,但确实可能会发生 —— 你可以正常地使用真正的 undefined, 而不会被外部的 undefined 意外影响。这是由 JavaScript 作用域规则决定的。
无论是否使用这个 undefined 参数,都应该避免使用 undefined 的字符串常量,如:

123 if(typeofmyVar === ''undefined'') {// bad part...}

因为如果你把字符串写错了,机器不会告诉你,而且会产生一个难以检查出来的 bug. 幸运的是,对于 JavaScript 来说,JsLint 可以帮你做这个校验。当 myVar 已定义的时候(通过形参或 var 声明),上面的代码改成这样会更易于调试:

123 if(myVar === undefined) {// good part...}

结论

从上面两个例子来看,我们建议不要传入 window, 但是可以安全地使用第二种方式 (写 undefined 形参);我们还要尽量避免使用字符串常量。
最后,最重要的是,这只是两个特定对象和类型的讨论,举一反三,你会更了解 JavaScript


16. 窗口函数 (Window Function) 的使用

16. 窗口函数 (Window Function) 的使用

从SQL Server 2005起,SQL Server开始支持窗口函数 (Window Function),以及到SQL Server 2012,窗口函数功能增强,目前为止支持以下几种窗口函数:

1. 排序函数 (Ranking Function) ;

2. 聚合函数 (Aggregate Function) ;

3. 分析函数 (Analytic Function) ;

4. NEXT VALUE FOR Function, 这是给sequence专用的一个函数;

 

. 排序函数(Ranking Function)

帮助文档里的代码示例很全。

排序函数中,ROW_NUMBER()较为常用,可用于去重、分页、分组中选择数据,生成数字辅助表等等;

排序函数在语法上要求OVER子句里必须含ORDER BY,否则语法不通过,对于不想排序的场景可以这样变通;

drop table if exists test_ranking

create table test_ranking
( 
id int not null,
name varchar(20) not null,
value int not null
) 

insert test_ranking 
select 1,''name1'',1 union all 
select 1,''name2'',2 union all 
select 2,''name3'',2 union all 
select 3,''name4'',2

select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY name) as num
from test_ranking

select id , name, ROW_NUMBER() over (PARTITION by id) as num
from test_ranking
/*
Msg 4112, Level 15, State 1, Line 1
The function ''ROW_NUMBER'' must have an OVER clause with ORDER BY.
*/

--ORDERY BY后面给一个和原表无关的派生列
select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY GETDATE()) as num
from test_ranking

select id , name, ROW_NUMBER() over (PARTITION by id ORDER BY (select 0)) as num
from test_ranking

 

. 聚合函数 (Aggregate Function)

SQL Server 2005中,窗口聚合函数仅支持PARTITION BY,也就是说仅能对分组的数据整体做聚合运算;

SQL Server 2012开始,窗口聚合函数支持ORDER BY,以及ROWS/RAGNE选项,原本需要子查询来实现的需求,如: 移动平均 (moving averages), 总计聚合 (cumulative aggregates), 累计求和 (running totals) 等,变得更加方便;

 

代码示例1:总计/小计/累计求和

drop table if exists test_aggregate;

create table test_aggregate
(
event_id      varchar(100),
rk            int,
price         int
)

insert into test_aggregate
values
(''a'',1,10),
(''a'',2,10),
(''a'',3,50),
(''b'',1,10),
(''b'',2,20),
(''b'',3,30)


--1. 没有窗口函数时,用子查询
select a.event_id, 
       a.rk,  --build ranking column if needed
       a.price, 
     (select sum(price) from test_aggregate b where b.event_id = a.event_id and b.rk <= a.rk) as totalprice 
  from test_aggregate a


--2. 从SQL Server 2012起,用窗口函数
--2.1 
--没有PARTITION BY, 没有ORDER BY,为全部总计;
--只有PARTITION BY, 没有ORDER BY,为分组小计;
--只有ORDER BY,没有PARTITION BY,为全部累计求和(RANGE选项,见2.2)
select *,
     sum(price) over() as TotalPrice,
     sum(price) over(partition by event_id) as SubTotalPrice,
       sum(price) over(order by rk) as RunningTotalPrice
  from test_aggregate a

--2.2 注意ORDER BY列的选择,可能会带来不同结果
select *,
     sum(price) over(partition by event_id order by rk) as totalprice 
  from test_aggregate a
/*
event_id    rk    price    totalprice
a    1    10    10
a    2    10    20
a    3    50    70
b    1    10    10
b    2    20    30
b    3    30    60
*/

select *,
     sum(price) over(partition by event_id order by price) as totalprice 
  from test_aggregate a
/*
event_id    rk    price    totalprice
a    1    10    20
a    2    10    20
a    3    50    70
b    1    10    10
b    2    20    30
b    3    30    60
*/

--因为ORDER BY还有个子选项ROWS/RANGE,不指定的情况下默认为RANGE UNBOUNDED PRECEDING AND CURRENT ROW 
--RANGE按照ORDER BY中的列值,将相同的值的行均视为当前同一行
select  *,sum(price) over(partition by event_id order by price) as totalprice from test_aggregate a
select  *,sum(price) over(partition by event_id order by price range between unbounded preceding and current row) as totalprice from test_aggregate a

--如果ORDER BY中的列值有重复值,手动改用ROWS选项即可实现逐行累计求和
select  *,sum(price) over(partition by event_id order by price rows between unbounded preceding and current row) as totalprice from test_aggregate a

 

代码示例2:移动平均

--移动平均,举个例子,就是求前N天的平均值,和股票市场的均线类似
drop table if exists test_moving_avg

create table test_moving_avg
(
ID    int, 
Value int,
DT    datetime
)

insert into test_moving_avg 
values
(1,10,GETDATE()-10),
(2,110,GETDATE()-9),
(3,100,GETDATE()-8),
(4,80,GETDATE()-7),
(5,60,GETDATE()-6),
(6,40,GETDATE()-5),
(7,30,GETDATE()-4),
(8,50,GETDATE()-3),
(9,20,GETDATE()-2),
(10,10,GETDATE()-1)

--1. 没有窗口函数时,用子查询
select *,
(select AVG(Value) from test_moving_avg a where a.DT >= DATEADD(DAY, -5, b.DT) AND a.DT < b.DT) AS avg_value_5days
from test_moving_avg b

--2. 从SQL Server 2012起,用窗口函数
--三个内置常量,第一行,最后一行,当前行:UNBOUNDED PRECEDING, UNBOUNDED FOLLOWING, CURRENT ROW 
--在行间移动,用BETWEEN m preceding AND n following (m, n > 0)
SELECT *,
       sum(value) over (ORDER BY DT ROWS BETWEEN 5 preceding AND CURRENT ROW) moving_sum,
       avg(value) over (ORDER BY DT ROWS BETWEEN 4 preceding AND CURRENT ROW) moving_avg1,
       avg(value) over (ORDER BY DT ROWS BETWEEN 5 preceding AND 1 preceding) moving_avg2,
       avg(value) over (ORDER BY DT ROWS BETWEEN 3 preceding AND 1 following) moving_avg3
FROM  test_moving_avg
ORDER BY DT

 

. 分析函数 (Analytic Function)

代码示例1:取当前行某列的前一个/下一个值

drop table if exists test_analytic

create table test_analytic
(
SalesYear         varchar(10),
Revenue           int,
Offset            int
)

insert into test_analytic
values
(2013,1001,1),
(2014,1002,1),
(2015,1003,1),
(2016,1004,1),
(2017,1005,1),
(2018,1006,1)

--当年及去年的销售额
select *,lag(Revenue,1,null) over(order by SalesYear asc) as PreviousYearRevenue from test_analytic
select *,lag(Revenue,Offset,null) over(order by SalesYear asc) as PreviousYearRevenue from test_analytic
select *,lead(Revenue,1,null) over(order by SalesYear desc) as PreviousYearRevenue from test_analytic

--当年及下一年的销售额
select *,lead(Revenue,1,null) over(order by SalesYear asc) as NextYearRevenue from test_analytic
select *,lead(Revenue,Offset,null) over(order by SalesYear asc) as NextYearRevenue from test_analytic
select *,lag(Revenue,1,null) over(order by SalesYear desc) as NextYearRevenue from test_analytic

--可以根据offset调整跨度

 

代码示例2:分组中某列最大/最小值,对应的其他列值

假设有个门禁系统,在员工每次进门时写入一条记录,记录了“身份号码”,“进门时间”,“衣服颜色",查询每个员工最后一次进门时的“衣服颜色”。

drop table if exists test_first_last

create table test_first_last
(
EmployeeID             int,
EnterTime              datetime,
ColorOfClothes         varchar(20)
)

insert into test_first_last
values
(1001, GETDATE()-9, ''GREEN''),
(1001, GETDATE()-8, ''RED''),
(1001, GETDATE()-7, ''YELLOW''),
(1001, GETDATE()-6, ''BLUE''),
(1002, GETDATE()-5, ''BLACK''),
(1002, GETDATE()-4, ''WHITE'')

--1. 用子查询
--LastColorOfColthes
select * from test_first_last a
where not exists(select 1 from test_first_last b where a.EmployeeID = b.EmployeeID and a.EnterTime < b.EnterTime)

--LastColorOfColthes
select *
from 
(select *, ROW_NUMBER() over(partition by EmployeeID order by EnterTime DESC) num
from test_first_last ) t
where t.num =1


--2. 用窗口函数
--用LAST_VALUE时,必须加上ROWS/RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING,否则结果不正确
select *, 
       FIRST_VALUE(ColorOfClothes) OVER (PARTITION BY EmployeeID ORDER BY EnterTime DESC) as LastColorOfClothes,
       FIRST_VALUE(ColorOfClothes) OVER (PARTITION BY EmployeeID ORDER BY EnterTime ASC) as FirstColorOfClothes,
       LAST_VALUE(ColorOfClothes) OVER (PARTITION BY EmployeeID ORDER BY EnterTime ASC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as LastColorOfClothes,
       LAST_VALUE(ColorOfClothes) OVER (PARTITION BY EmployeeID ORDER BY EnterTime DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as FirstColorOfClothes
from test_first_last

--对于显示表中所有行,并追加Last/First字段时用窗口函数方便些
--对于挑选表中某一行/多行时,用子查询更方便

 

. NEXT VALUE FOR Function

drop sequence if exists test_seq

create sequence test_seq
start with 1
increment by 1;

GO

drop table if exists test_next_value

create table test_next_value
(
ID         int,
Name       varchar(10)
)

insert into test_next_value(Name)
values
(''AAA''),
(''AAA''),
(''BBB''),
(''CCC'')

--对于多行数据获取sequence的next value,是否使用窗口函数都会逐行计数
--窗口函数中ORDER BY用于控制不同列值的计数顺序
select *, NEXT VALUE FOR test_seq from test_next_value
select *, NEXT VALUE FOR test_seq OVER(ORDER BY Name DESC) from test_next_value

 

参考:

SELECT - OVER Clause (Transact-SQL)

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

SQL Server Windowing Functions: ROWS vs. RANGE

https://www.sqlpassion.at/archive/2015/01/22/sql-server-windowing-functions-rows-vs-range/

关于Windows服务 – 封装现有function服务器封装是什么意思的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于$(window).load(function() {})和$(document).ready(function(){})的区别、$(window).load(function(){})和$(document).ready(function(){})的区别、(function (window, undefined){})(window)、16. 窗口函数 (Window Function) 的使用的相关知识,请在本站寻找。

本文标签: