最近文章:高可用数据采集平台(如何玩转3门语言php+.net+aauto)、高并发数据采集的架构应用(Redis的应用)
项目文档:关键词匹配项目深入研究(二)- 分表思想的引入
吐槽:本人也是非常讨厌拿来主义的,有些培训每个细节都提到过,主管还找我要实际案例,而不是去安排合适的人去做这件事情,有点过于拿来主义了,有点担心。
好消息的是:高并发数据采集的架构应用(Redis的应用)团队已经实现了,不过有部分代码还是我写的,值得喝彩下,说明团队的能力还是不错的。
最近有时间,我也是用.net完成高可用数据采集平台(如何玩转3门语言php+.net+aauto)服务的编码工作。
正文开始
要想快速学习某一件事情,我们就得必须做好规划。
首先我们先来分析下要实现该项目需要哪些方面的技术,我们从哪里开始分析呢,当然有系统分析师帮你做啦!
所需的技术
1. Microsoft Studio 2010 IDE以及.Net Framework基础知识的了解
2. 如何利用C#创建服务,服务安装以及卸载
3. SQLite的基础应用以及C#如何使用SQLite
4. C#定时器的应用
5. C#的多线程应用以及线程池的应用
6. 操作系统信号量,互斥同步锁概念以及C#如何使用信号量、互斥同步锁
7. C#文件操作,ini配置文件读取技术
8. C# WEB API的调用,以及异步处理知识和C# TASK的了解应用
9. 数据传输解析技术,以及C#如何解析JSON
10. 其它常用应用,比如DataSet、DataTable、DataRow、Dictionary、List、KeyValuePair、String等
这些点看起来好恐怖,要想做好应用这些只是小小的一部分,但相对于菜鸟或者学生们就等于天书了,但是我只有一个星期的事情。
只要我们有目的去做事,任何事都不会有阻碍,废话少说,等下闲我啰嗦了。
1. Microsoft Studio 2010 IDE以及.Net Framework基础知识的了解
这点我竟然列为了重点,有些人有可能对这点不重视,但是我相信很多有经验的人都会同我一样非常重视这点。
Microsoft Studio 2010 IDE都不用说了,这个大家都是专家,我为什么会选择博客园写文章,是因为我在上学的时候看了一本博客园出版的书,讲的是设计模式的应用,觉得非常的不错,当时博客园是.Net技术平台的佼佼者。
Microsoft Studio 2010 IDE最主要的一点,就是选择框架,选择项目适合的框架。
.Net Framework 主要也是注意下为什么有那么多版本,了解下他们互相是否有关系,比如从2.0升到4.0是否能够平稳的过渡。
2. 如何利用C#创建服务,服务安装以及卸载
我也是看了一篇博客而学来的,非常不错,我也把地址贴出来:http://www.VEVb.com/aierong/archive/2012/05/28/2521409.html
我也是主要用了(a) 利用.net框架类ServiceBase,步骤参考上面博客的地址:安装的时候注意下选择好对应版本的installutil。
代码贴出来
public partial class MainService : ServiceBase { readonly System.Timers.Timer _timer_request; readonly System.Timers.Timer _timer_upload; WorkPRocess work = new WorkProcess(10); public MainService() { InitializeComponent(); //install db table TaskModel.install(); _timer_upload = _timer_request = new System.Timers.Timer(5000) { AutoReset = true, Enabled = true }; _timer_request.Elapsed += delegate(object sender, ElapsedEventArgs e) { Logger.log("Start Request Data From Api"); try { TaskResponse response = TaskFactory.createFromApi(); TaskModel.save(response); } catch (Exception ex) { Logger.error(ex.Message); } Logger.log("End Request Data From Api"); }; _timer_upload.Elapsed += delegate(object sender, ElapsedEventArgs e) { Logger.log("Start Upload Data To Api"); try { if (!work.wait()) { work.doing(); } } catch (Exception ex) { Logger.error(ex.Message); } Logger.log("End Upload Data To Api"); }; } protected override void OnStart(string[] args) { _timer_request.Enabled = true; _timer_upload.Enabled = true; } protected override void OnStop() { _timer_request.Enabled = false; _timer_upload.Enabled = false; } }
3. SQLite的基础应用以及C#如何使用SQLite
也是一样,有博客就是好,推荐代码直接拷贝一份过来。http://www.VEVb.com/OnlyVersion/p/3746086.html
我也贴个相对精简的吧。
class DB { /// <summary> /// 获得连接对象 /// </summary> /// <returns>SQLiteConnection</returns> public static SQLiteConnection GetSQLiteConnection(){ string str = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var con = new SQLiteConnection("Data Source=" + str + @"/" + "DataBase" + @"/" + "InfoServiceDb.db"); return con; } /// <summary> /// 准备操作命令参数 /// </summary> /// <param name="cmd">SQLiteCommand</param> /// <param name="conn">SQLiteConnection</param> /// <param name="cmdText">Sql命令文本</param> /// <param name="data">参数数组</param> private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, Dictionary<String, String> data) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Parameters.Clear(); cmd.Connection = conn; cmd.CommandText = cmdText; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 30; if (data != null && data.Count >= 1) { foreach (KeyValuePair<String, String> val in data) { cmd.Parameters.AddWithValue(val.Key, val.Value); } } } /// <summary> /// 查询,返回DataSet /// </summary> /// <param name="cmdText">Sql命令文本</param> /// <param name="data">参数数组</param> /// <returns>DataSet</returns> public static DataSet ExecuteDataset(string cmdText, Dictionary<string, string> data) { var ds = new DataSet(); using (SQLiteConnection connection = GetSQLiteConnection()) { var command = new SQLiteCommand(); PrepareCommand(command, connection, cmdText, data); var da = new SQLiteDataAdapter(command); da.Fill(ds); } return ds; } /// <summary> /// 查询,返回DataTable /// </summary> /// <param name="cmdText">Sql命令文本</param> /// <param name="data">参数数组</param> /// <returns>DataTable</returns> public static DataTable ExecuteDataTable(string cmdText, Dictionary<string, string> data) { var dt = new DataTable(); using (SQLiteConnection connection = GetSQLiteConnection()) { var command = new SQLiteCommand(); PrepareCommand(command, connection, cmdText, data); SQLiteDataReader reader = command.ExecuteReader(); dt.Load(reader); } return dt; } /// <summary> /// 返回一行数据 /// </summary> /// <param name="cmdText">Sql命令文本</param> /// <param name="data">参数数组</param> /// <returns>DataRow</returns> public static DataRow ExecuteDataRow(string cmdText, Dictionary<string, string> data) { DataSet ds = ExecuteDataset(cmdText, data); if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) return ds.Tables[0].Rows[0]; return null; } /// <summary> /// 执行数据库操作 /// </summary> /// <param name="cmdText">Sql命令文本</param> /// <param name="data">传入的参数</param> /// <returns>返回受影响的行数</returns> public static int ExecuteNonQuery(string cmdText, Dictionary<string, string> data) { using (SQLiteConnection connection = GetSQLiteConnection()) { var command = new SQLiteCommand(); PrepareCommand(command, connection, cmdText, data); return command.ExecuteNonQuery(); } } /// <summary> /// 返回SqlDataReader对象 /// </
新闻热点
疑难解答