最近文章:高可用數據采集平臺(如何玩轉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.survivalescaperooms.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.survivalescaperooms.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對象 /// </
新聞熱點
疑難解答