首页 > 代码库 > 第一个任务--C# Windows服务(二)

第一个任务--C# Windows服务(二)

好不容易装上了,又得把服务卸掉,好吧,我们开始编写这个服务。

首先这是一个周报提醒工具,主要功能就是提醒,用何种方式呢? 弹窗呗。

这个工具肯定和时间有关的,因为它需要到点报时,周报一般是周末交嘛,就定成周五下午3点吧。

这样思路就清晰了,我要做的就是一个每周五下午三点会弹窗的一个小程序。

恩...可是往哪里添代码呢...

于是打开Service的代码编辑器,发现有一个OnStart方法和一个OnStop方法,这是什么呢?他们就是启动服务和停止服务时要进行的操作。

下面我们要进行时间的判断,我想告诉电脑,如果到了周五下午三点,你就给我弹个窗。

想法是很简单,但是我如果写一个:

If(时间是周五下午三点)
{
弹窗;
}

能实现吗?根据我的试验是不行的,好像只能用计时器来实现这个功能,让它每隔一段时间检测一下“到点了吗”,然后再触发事件,我也不知道有没有什么高超的办法可以不需要通过计时器直接让电脑到点自动触发事件,总之这里先讲讲我的办法。

给服务添加一个Timer,把Interval属性(触发间隔时间)设成1000毫秒,也就是1秒

添加后打开服务的Designer,把有“Windows.Form”的地方都改成“Timers”,我不太清楚为什么,但是当我双击Timer控件添加事件的时候,Form下的Timer事件是Tick,Timers下的Elapsed才是我要的,想深究的具体可以参考这篇文章:http://www.cnblogs.com/OpenCoder/archive/2010/02/23/1672043.html

好的,双击Timer添加事件Elapsed,它是时间间隔到了以后要执行的操作,然后我们还必须要在OnStart方法里写上:

protected override void OnStart(string[] args)
{
  TimeMachine.Elapsed += new System.Timers.ElapsedEventHandler(TimeMachine_Elapsed);
}

不用管这个啥意思,我也不懂,反正这个就是触发事件的语句。

下面来试验一下能否弹窗,在Elapsed事件里写个MessageBox,这样服务启动后每秒都会触发Elapsed事件弹一个窗口。咦?MessageBox呢?怎么没这个东西?

查了之后才知道,原来服务是一个只有后台没有用户界面的程序,想要弹出消息框,必须要引用System.Windows.Form程序集。之后还要在服务的属性里勾上“允许服务与桌面交互”:

唉,别看一个小小的服务程序,做起来还是挺麻烦的。好了,这下可以试试了。重新生成服务,安装启动,这个时候服务应该已经在系统里跑起来了。恩? 怎么没反应?

一瞬间我就头大了,走到这一步,已经是穷途末路,完全不知道该如何解决。我只好硬着头皮在网上找解决方法。

终于皇天不负有心人,让我找到一位大神(居然是微软MVP,大神就是屌),原来这个是Session 0隔离的问题,这个就高端了,一共有两篇文章,具体的可以查看:http://www.cnblogs.com/gnielee/archive/2010/04/07/1706229.html

我用了大神的解决办法,新建了一个Interop类,把大神代码粘进去,然后用里面的方法调窗口,哈哈,成功了!

private void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
  Interop.ShowMessageBox("今天,你交周报了吗? 恩?", "友情提示");
}

这样就好了,基本的功能的实现方法都找到了,下一篇好好部署一下。