从流程图中可以看出当程序自动启动时不管网络连接正常与否都需要从读取出来的图书中过虑出进入提示框,所以很有必要把这种实现单独拿出来实现,避免重复的工作。
创建工程SendWarningBook,添加一个类叫WarningBookService,添加发要的引用,该类实现的功能很简单,就是送进入一个图书类的集合,之后它再从本地XML文件中读取用户设置的多少天就进入警戒范围的时间,再把该时间与送进来的图书的时间对比,符合要求的就发到提示框,如果没有符合要求的就退出程序。
这里还有一点问题就是当网络连接正常与不正常时处理有点不一样,当网络连接正常时是等Application.Run()之后它才来这里,当不正常时是没有Application.Run()时就来这里,所以当没有进入警戒范围的图书时我们不能直接退出程序,就给它返回一个值来确定是否有进入警戒范围的图书。
该类中提供一个构造函数来接收图书集合和一个执行发送的方法。
实现如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using LibraryHelper.Model;
using LibraryHelper.DALService;
using LibraryHelper.WarningUI;
namespace LibraryHelper.SendWarningBook
{
public class WarningBookService
{
//进入警戒范围的书
List<Book> warningBookList = new List<Book>();
//读取出来的全部图书信息
List<Book> allBookList;
Boolean isRun = true; //设置是否启动应用程序的Run方法,如果没有进入警戒范围的书就不启动
public WarningBookService(List<Book> allBookList)
{
this.allBookList = allBookList;
}
public Boolean SendWarningBook()
{
//从配置文件中取得警戒范围的天数
SettingXMLService settingXMLService = new SettingXMLService();
Int32 warningDay = Convert.ToInt32(settingXMLService.GetWarningDay());
//当前时间
DateTime timeNow = DateTime.Now;
//遍历所有书,找出进入警戒范围的
Int32 bookNum = allBookList.Count;
for (Int32 i = 0; i < bookNum; i++)
{
//应还图书时间
DateTime timeReturn = allBookList[i].ReturnDate;
//时间差
TimeSpan timespan = timeReturn - timeNow;
//只取天数
Int32 dayNum = timespan.Days;
//如果这个时间差小于或等于设置的天数,就加进提示框
if (warningDay >= dayNum)
{
allBookList[i].WarningDay = dayNum;
warningBookList.Add(allBookList[i]);
}
}
//如果有进入警戒范围的就弹出提示框,没有就退出程序
if (warningBookList.Count > 0)
{
frmWarning frm = new frmWarning(warningBookList);
frm.Show();
}
else
{
isRun = false; //当网络连接不正常,没有进入警戒范围的图书就返回false不启动Run方法
Application.Exit();//当网络连接正常,已经启动了Run方法,用些方法退出程序
}
return isRun;
}
}
}