深度优先

这个家伙好懒,除了文章什么都没留下

0%

转载自:http://www.cnblogs.com/xujie/p/5695673.html

1、新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在一些低版本系统上无法正常运行。

2、添加Windows服务的安装程序。

在默认Service1设计器界面空白处点击右键->添加安装程序,系统会自动新建一个带有默认配置的安装程序类,如下图:

新建完安装程序后,需要给默认的serviceInstaller1和serviceProcessInstaller1做一些基本的属性设置。如下图:

以上工作完成,安装程序配置完毕。

注意:如果不给服务添加安装程序,后面是没法把服务安装至windows系统里的。

3、添加应用程序配置文件(如果有需要的话)。

如果项目有需要,一些应用程序的配置参数可以设置在此文件里(例如:数据库连接字符串)。

4、编写windows服务主代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WinServiceTest
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();

System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(TimedEvent);
timer.Interval = 5000;//每5秒执行一次
timer.Enabled = true;
}
public int count = 0;
//定时执行事件
private void TimedEvent(object sender, System.Timers.ElapsedEventArgs e)
{
//业务逻辑代码
EmailClass mail = new EmailClass();

mail.Email(count++);
}

protected override void OnStart(string[] args)
{
this.WriteLog("\n当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + "\n");
this.WriteLog("客户端数据同步服务:【服务启动】");
}

protected override void OnStop()
{
this.WriteLog("\n当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss")+ "\n");
this.WriteLog("客户端数据同步服务:【服务停止】");
}
protected override void OnShutdown()
{
this.WriteLog("\n当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + "\n");
this.WriteLog("客户端数据同步服务:【计算机关闭】");
}

#region 记录日志
/// <summary>
/// 记录日志
/// </summary>
/// <param name="msg"></param>
private void WriteLog(string msg)
{

//string path = @"C:\log.txt";

//该日志文件会存在windows服务程序目录下
string path = AppDomain.CurrentDomain.BaseDirectory + "\\log.txt";
FileInfo file = new FileInfo(path);
if (!file.Exists)
{
FileStream fs;
fs = File.Create(path);
fs.Close();
}

using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(DateTime.Now.ToString() + " " + msg);
}
}
}
#endregion
}
}

4、安装与卸载服务

readme里面的内容

1
2
3
请将【WinServiceTest】拷贝到D盘或C盘根目录;
安装服务【管理员身份】运行【SC安装-发送邮件】即可;
卸载服务【管理员身份】运行【SC卸载】即可;

SC安装-发送邮件:

1
2
3
4
5
6
7
8
9
@echo.请稍等,服务启动......  
@echo off
@sc create GX_To_EMAIL binPath= "D:\WinServiceTest\WinServiceTest\bin\Debug\WinServiceTest.exe"
DisplayName=每隔一段时间发送邮件的服务 start= auto
@sc description GX_To_EMAIL 定时发送邮件
@sc start GX_To_EMAIL
@echo off
@echo.启动完毕!
@pause

SC卸载:

1
2
3
4
5
6
7
8
@echo.服务卸载......  
@echo off
@sc stop GX_To_EMAIL
@sc delete GX_To_EMAIL
@sc stop GX_To_EMAIL
@echo off
@echo.卸载完毕!
@pause

今天有同学问我个面试题:Asp.net_mvc中.cshtml与之前asp.net中的.aspx的区别?

谁说都会用,但有时候扣知识点还是比较蒙的,然后网上搜了一篇还不错,将得挺细致的。

转载自:http://www.cnblogs.com/qq731109249/p/3495610.html

一,MVC和三层架构的区别

①什么是三层架构?

在学校的时候,和同学或者老师一起讨论MVC的时候,别人可能会说,“不就是三层架构嘛!实体层(Model),用来创建对象的实体;业务逻辑层(BLL),用来处理复杂的数据间的关系或者是业务间的关系;数据库访问层(DAL),用来用来访问数据库的;当然还会有,View(视图层),用来展示数据;”其实自己虽然知道不是这样,但是自己也仅仅是了解一点点,也解释不清楚,所以也就算了。(具体的三层架构之间的操作的关系可以看我以前的博客【ASP.NET开发】.NET三层架构简单解析)。

它们之间互相操作的关系,基本的示意图如下:

还记的暑假在郑州找实习工作的时候,被别人问过一个n层架构的概念,当时就懵了,尼玛的压根就没听说过啊!不过后来查询资料知道,所谓的n曾架构就是根据系统的需要把业务逻辑层(BLL)或者数据库访问层(DAL)再抽象成几个层次(具体的就是再抽象成类),便于逻辑的处理和代码模块的维护。其基本原理还是基于三层架构。

②什么是MVC呢?

MVC其实是软件架构的一种模式,也就是我们经常说的设计模式。其中主要包括三个模块,就是如MVC名字所显示的那样:模型(Model),视图(View),控制器(Controller);

其中这里的模型(Model)和视图(View )是完全区别于三层架构中的模型(Model)和视图(View)的。

1)MVC中的模型(Model)指的是数据模型,用于封装与应用程序的业务逻辑相关的数据,除此之外还可以封装数据的处理方法(相当于业务逻辑)。这是完全区别于三层架构的模型层(Model)的。

MVC中模型(Model)的特点:

①有对数据直接访问的权利,如:对数据库的访问;

②模型(Model)“不依赖”视图(View)和控制器(Controller),即模型(Model)不关心它会被如何显示或者如何被操作;

③模型(Model)中数据的变化一般会通过一种刷新机制被“公布”;

④为了实现③中的“机制”用于监视此模型的视图必须事先在此模型上注册。从而,视图可以了解在数据模型上发生的改变。

2)视图(View),这里的视图基本跟三层中的视图一样,都是为了显示数据,没有程序上的逻辑。为了实现视图上数据的刷新,视图(View)需要访问它监视的模型(Model),所以应该事先在被它监视的数据那里进行注册。

3)控制器(Controller),这个概念是在三层中不存在的概念。它主要起到不同层面的组织作用,用于控制应用程序的流程。主要处理事件并作出相应。“事件”主要包括:用户的行为和数据的改变。

以上就是关于三层架构和MVC在概念上的区别。

二,WebForm网站和MVC网站运行机制的区别

①WebForm网站的运行机制

比如说我们现在要访问一个WebForm站点:www.google.com.hk/Default.aspx(仅仅是示例)。我们的浏览器和服务器都是做了哪些动作呢?

1)首先浏览器会向目的服务器发送请求报文。

配置过IIS的都知道,网站挂载在服务器上,我们是通过访问虚拟目录的方式访问网站的。这时候目的主机的IIS接收的是访问该虚拟目录下Default.aspx文件的请求;(当然这也是一个非常复杂的过程,包括请求DNS服务器,找到目的主机IP,根据IP地址访问目的主机。复杂的网络过程就不叙述,有兴趣的自己找资料学习);

2)服务器端的IIS软件接收到请求后,把请求交给.NET FramWork进行处理;

3).NET FramWork会创建Default_aspx类的对象,也就是我们所说的页面对象。(在WebFrom网站创建完,并且编译后Default.aspx会被编译成Default_aspx类)

到现在的整个过程都还是Http请求,IIS的内部机制会去实现一个IHttphandler的接口,其中该接口实现一个ProcessRequestfang方法

MSDN是这样解释的

该ProcessRequest()方法会去调用对应页面的Page_Load() 方法

1
1 protected void Page_Load(object sender, EventArgs e) 2  { 3 //处理的业务逻辑或者是访问数据库的代码 4 //要输出的Html或者其它内容 5 }

4)返回给浏览器(包括Html,CSS,Js等等)

流程示意图如下:

②MVC网站的运行机制

还比如说我们现在要访问一个MVC站点:www.google.com.hk/FirstPage/Default(仅仅是示例)。我们的浏览器和服务器又做了哪些动作呢?

1)浏览器向服务器发送Request请求报文(FirstPage/Default)

2)服务器端的IIS相应Request请求

3).NET FramWork根据路由配置,解析URL,并创建FirstPage类的对象,并调用相应的Default方法

1
1 public ActionResult Default() 2  { 3 4 return View();//返回给视图 5 }

4)然后会访问视图文件夹下的Default.cshtml,返回给浏览器(其中包括html,css,js等等)

流程的示意图如下:

这只是一个比较简单的运行过程。其实在这过程中发生了很多事情,比如说:执行Global.asax中的Application_Start()方法来完成一些初始化的工作等等,会在以后的文章中继续解析。

以上就是WebForm网站和MVC网站运行机制的区别。

那么到底使用MVC的优点比WebForm到底有哪些优点呢?

①最重要的就是.NET程序员在开发的时候再也不会使用那些被很多人诟病的微软封装的控件了。

②MVC设计模式降低了模型(Model,业务和数据)和视图的耦合关系。包括我们在开发WebForm网站使用三层架构的思想也是为了降低数据和视图的耦合等;

③可以复用视图,也就是说同样的数据可以使用不同的视图以不同的图标展示出来。

——————————————————-理论到此结束—————————————————————

常用的WebForm开发方式就不举例了,我下边主要演示一个基本的MVC程序的创建和运行过程。

要创建MVC程序VS肯定是必不可少的,我的开发环境是VS2013,大家请酌情考虑自己的VS版本。

①首先的打开“文件”→“新建项目”,在左侧的项目栏选择“Visual C#”→“Web”,在右边就可以看到有“ASP.NET Web窗体应用程序”和“ASP.NET MVC 4 Web应用程序”如下图:

②因为要创建MVC程序就选择点击第二个选项然后会看到项目模板,默认的是选择“Internet应用程序”,如果选择默认的话,就会默认的创建一个具有基本功能的站点。我们这里选择“基本”,VS只会创建包含基本框架简的模板

③创建完以后我们会在解决方案下看到代码的树状结构,其中包含Models,Views和Controllers三个文件夹

④我们首先创建实体对象Model,在Models文件夹下创建一个Child类,并声明属性和初始化

复制代码

1
1 public class Child  2  {  3 //编号  4 private int id;  5  6  7 public int Id  8  {  9 get { return id; } 10 set { id = value; } 11  } 12 13 //姓名 14 private string strName; 15 16 public string StrName 17  { 18 get { return strName; } 19 set { strName = value; } 20  } 21 22 }

复制代码

⑤在Controllers文件夹上右键,“添加”,会看到有“控制器”的选项,如下图:

点击”控制器”后会出现一个“添加控制器”窗体,在控制器名称中”Default1Controller“中”Default1“是默认选中的,我们修改其名称为”HomeController“,

注意:这里的”Default1Controller“中的”*Controller“是必须保留的,主要是因为MVC框架有一个”约定大于配置“的规则

单击”添加“添加控制器,默认生成的控制器代码,如下:

复制代码

1
1 //默认生成的控制器代码  2 public class HomeController : Controller  3  {  4 //  5 // GET: /Home/  6  7 //包含一个Action方法  8 public ActionResult Index()  9  { 10 //返回给视图 11 return View(); 12  } 13 14 }

复制代码

⑥然后我们创建一个集合来初始化在Models中创建的Child类的属性值

复制代码

1
1 #region 初始化数据集合 +List InitData()  2 /// <summary>  3 /// 初始化数据集合  4 /// </summary>  5 /// <returns></returns>  6 public List<Models.Child> InitData()  7  {  8  9 List<Models.Child> list = new List<Models.Child>() 10  { 11 new Child(){Id=1,StrName="你好啊!"}, 12 new Child(){Id=2,StrName="不好啊!"} 13  }; 14 15 return list; 16  } 17 18 #endregion

复制代码

然后开始编写Action方法,即”ActionResult Index()“方法,

复制代码

1
1 /// <summary>  2 /// Action方法(相当于MVC设计模式的Model)  3 /// </summary>  4 /// <returns></returns>  5  6 public ActionResult Index()  7  {  8 //可以处理当前业务(你比如读取数据库,判断等)  9 StringBuilder strBuilder = new StringBuilder(); 10 //创建数据集合,获取数据 11 List<Models.Child> list = InitData(); 12 //遍历集合获取生成的Html代码 13 list.ForEach(d => 14  { 15 strBuilder.AppendLine("<div>" + d.Id.ToString() + "</div>"); 16  }); 17 18 //使用ViewBag传输数据给同名的Indexcshtml视图 19 //ViewBag是一个dynamic类型的集合,可以动态添加任意类型的任意名称和属性 20 ViewBag.HtmlStrBuilder = strBuilder.ToString(); 21 //加载同名视图Index.cshtml 22 return View(); 23 }

复制代码

在其中我们使用ViewBag把数据传输给同名的Views文件夹下的同名视图。

⑦创建视图接收数据,上面代码的Index方法上右键,会出现”添加视图“,如下图

之后会在Views文件夹下,生成一个Home文件夹,Home文件夹下面会有一个Index.cshtml文件(这个就是视图文件)

⑧视图接收数据

复制代码

1
1 <html>  2 <head>  3 <meta name="viewport" content="width=device-width" />  4 <title>Index</title>  5 </head>  6 <body>  7 <div>  8 <!---------相当于把Action方法中保存的内容输出--------->  9  @Html.Raw( @ViewBag.HtmlStrBuilder) 10 </div> 11 </body> 12 </html>

复制代码

到这里基本上就完成了一个MVC程序的创建,我们运行程序,结果如下:


注意:因为MVC的运行机制跟WebForm不一样,所以浏览的方式也不一样。我们可以直接在Views文件夹上右键,选择在浏览器中查看就可以预览到结果。

实训实在太过乏味无聊,还好电脑上有小游戏,可以玩下扫雷,蜘蛛纸牌。

突然好怀念高中时家里的那个win7台式机,时常断网时玩扫雷,植物大战僵尸等….

无奈,昨天想玩扫雷,燃鹅,win10系统下并没有自带扫雷游戏了,然后网上找了下

都是什么鬼,网上找的扫雷游戏画质太差,然后都不知道怎么点右键插旗子。

AV画质大概是如下:

哦,旁边有说明,但是操作还是很不方便。

然后昨天晚上就在构思怎么写一个扫雷的游戏,想了下,… oh ,so easy

今天一大早起来,然后动手写了起来,一上午时间基本功能都实现了

大概效果图如下:

ps:图片盗取QQ表情的

难点可能就是,随机生成地雷的位置,然后怎么判断点开一个它周围有几颗雷,边界位置的计算

点到雷后引爆所有的雷,游戏结束,鼠标右键事件,三种状态的切换等,再就是一些CSS样式。。。

html代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<body>
<div>
<br />
<h2>扫雷游戏</h2>
<br />
横向:<input type="number" name="name" value="30" disabled /> 格  
纵向:<input type="number" name="name" value="16" disabled /> 格  
摆放:<input type="number" name="name" value="99" disabled /> 颗雷  
<input type="button" id="btnStart" name="name" value="按F5开始游戏" />
<br /><br />
<table></table>
<br />
<fieldset>
<legend>记录情况</legend>
用时:<input type="text" disabled name="name" id="time" value="" />
             
剩余:<input type="text" disabled name="name" id="time" value="" />
<img src="./img/5.png" alt="Alternate Text" />
<br /><br />
</fieldset>
<!--<fieldset id="clickLenard">
<legend>鼠标事件监听</legend>
</fieldset>-->
</div>
</body>

js代码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<script type="text/javascript">
var x = 30, y = 16, zd = 99, xy = x * y;
var M = {};
var falg = false, start = true;
$(function () {
myclock();

var k = 1, t = zd, bool, count = 0;
var table = '<table border="1">';
for (var i = 0; i < y; i++) {
table += "<tr>"
for (var j = 0; j < x; j++) {
var num = Math.random() * xy;
num = parseInt(num, 10);
if (num > t) {
bool = k;//普通
xy--;
} else {
bool = -k;//雷
t--;
count++;
}
table += "<td id='" + (bool) + "'></td>";
k++;
};
table += "</tr>"
};
table += "</table>";
$("table").append(table);
$("td").addClass("load");

/*给所有方块注册鼠标进入事件,将背景变成黄色*/
$("td").mousemove(function () {
if ($(this).attr("class") == "load") {
$(this).addClass("move");
}
});

/*给所有方块注册鼠标移出事件,去除鼠标进入时的样式*/
$("td").mouseout(function () {
$(this).removeClass("move");
});

$("td").mousedown(function (e) {
if (falg == true) {
M.dialog13 = jqueryAlert({
'icon': './img/warning.png',
'content': '踩到雷了,游戏结束!',
'closeTime': 2000,
});
return false;
};

if (start == false) {
M.dialog13 = jqueryAlert({
'icon': './img/error.png',
'content': '请先点开始游戏!',
'closeTime': 2000,
});
return false;
}

console.log(e.which);
//右键为3
if (3 == e.which) {
var t = this.id;/*获取单击块的id*/
//右键的三种状态切换
if ($(this).attr("class").indexOf("qizi") >= 0) {
$(this).removeClass("qizi");
$(this).addClass("click");
}
else if ($(this).attr("class").indexOf("load") >= 0) {
$(this).removeClass("load");
$(this).addClass("qizi");
}
else if ($(this).attr("class").indexOf("click") >= 0) {
$(this).removeClass("click");
$(this).addClass("load");
}
} else if (1 == e.which) {//左键为1
/*获取单击块的id*/
var t = this.id;

//当t>0时不为雷,计算周围有几个雷,显示数字
if (t > 0) {
if ($(this).attr("class").indexOf("qizi") < 0) {
$(this).removeClass("load");
$(this).removeClass("move");

//计算周围有几个雷
var sum = checkCount(t);
$(this).text(sum);
}
} else {

if ($(this).attr("class").indexOf("qizi") < 0) {
//当t<0时,表示点到了炸弹,引爆所有的炸弹
$(this).removeClass("load");
$(this).addClass("zhadang");
falg = true;
M.dialog13 = jqueryAlert({
'icon': './img/warning.png',
'content': '踩到雷了,游戏结束!',
'closeTime': 2000,
});
//引爆.....所有炸弹
bobobo();
start = false;
myclock = null;
}
}
}
});

//阻止浏览器默认右键点击事件
$("table").bind("contextmenu", function () {
return false;
});
////开始游戏,
$("#btnStart").click(function () {
location.reload();
})
});

//计算周围有几颗雷
function checkCount(id) {
//$("#clickLenard").append('<p>鼠标左键点击了:' + id + '</p>');

var arr = [-x - 1, -x, -x + 1, -1, 1, x - 1, x, x + 1];
var sum = 0;
for (var i = 0; i < arr.length; i++) {
var temp = (parseInt(id) + arr[i]);
if (temp <= 0) continue;
if (temp > x * y) continue;
if (id % x == 1 && (i == 0 || i == 3 || i == 5)) continue;
if (id % x == 0 && (i == 2 || i == 4 || i == 7)) continue;
var a = $("#" + temp).length > 0 ? 0 : 1;
sum += a;
//$("#clickLenard").append('<p>周围:' + temp + "-->>" + a + "" + '</p>');
}
return sum;
}

//显示所有的地雷
function bobobo() {
for (var i = 1; i <= x * y;) {
var id = "#-" + i;
$(id).addClass("zhadang");
i++
}
}

/*计时开始*/
var times;
function myclock() {
var t = $("#time").val();
t = t.substring(0, t.length - 2);
t = 1 + Number(t) + 'ms';
$("#time").attr('value', t);
times = setTimeout("myclock()", 100);
}
</script>

CSS样式部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<style type="text/css">
body {
background-color: #272822;
color: #E6E6E6;
text-align: center;
}

table {
min-height: 25px;
line-height: 25px;
text-align: center;
border-color: #E6880A;
border-collapse: collapse;
border-width: 2px;
}

td {
cursor: pointer;
border-width: 1px;
width: 26px;
height: 26px;
}

.load {
background-image: url("./img/3.png");
}

div {
width: 820px;
margin: auto;
}
/*鼠标进入样式*/
.move {
background-image: url("./img/6.png");
}

/*鼠标单击左键-【不是雷】样式*/
.click {
background-image: url("./img/1.png");
}

/*鼠标单击右键-【插旗】样式*/
.qizi {
background-image: url("./img/5.png");
}

/*鼠标单击左键-【点炸弹了】样式*/
.zhadang {
background-image: url("./img/4.png");
}

input[type="number"] {
width: 45px;
}
</style>

游戏链接地址:http://www.bfsdfs.com/saolei/index.html