C#多線程|匿名委托傳參數|測試您的網站能承受的壓力|附源代碼

發表于:2012-02-14來源:博客園作者:Perky Su點擊數: 標簽:C#
我們一直在做網站,但在我河南這塊,對測試工作,特別是壓力測試一般都不怎么在意,都是自己訪問一下速度不錯就行了,再就是數據庫訪問速度測試也是同樣情況 程序員在寫Sql代碼時,一般是一個人寫完之后,一運行可快完事

  我們一直在做網站,但在我河南這塊,對測試工作,特別是壓力測試一般都不怎么在意,都是自己訪問一下速度不錯就行了,再就是數據庫訪問速度測試也是同樣情況

  程序員在寫Sql代碼時,一般是一個人寫完之后,一運行可快完事

  其實這些是不夠的,我們根本沒有進行過多用戶多線程的測試,如果是100個,一千個要同時訪問,還會有這樣的速度嗎?

  我們自己反思一下是不是有這樣的經歷呢,我做的網站剛上傳服務器,打開很快,調數據庫1000條以內一秒用不了,感覺非常好,但過了不幾天,就會感覺到網站很慢很慢,于是去檢查測試

  其實這些可以提前做的,我下面來實現一個多線程測試網站訪問速度的功能。

  效果

  說明:

  1.一次可以開N多個線程;

  2.可以設置要訪問的地址;

  3.可以設置要循環訪問的次數;

  相關技術點:

  1.C# Winform;

  2.httpHelper類;這是我之前自己寫的一個類,大家可以參考一下(帶證書,無視編碼,設置代理等)

  3.多線程;

  4.線程之間的傳參;

  5.委托與匿名委托的使用方法;

  實現步驟:

  1.新建一個CS項目,AutoFor,新建一個窗體為TextFor

  2.自己拉幾個控件實現如下界面

  3.定義一個委托用來修改DataGridview的值,代碼如下

  //修改表格的委托 private delegate void UpDateDgvDelegate(string msg, int rowId, string columnName); private UpDateDgvDelegate _upDateStateDelegate; //構造器 public TextFor() { InitializeComponent(); _upDateStateDelegate = new UpDateDgvDelegate(UpDateDgv); } ///

/// 修改表格的行數據 /// ///要修改為的數據 ///行號 ///列名 private void UpDateDgv(string msg, int rowId, string columnName) { try { dgvTextFor.Rows[rowId].Cells[columnName].Value = msg.ToString(); } catch { } }

  復制代碼

  4.在單擊開始時先生成對應的線程表格式,就是界面上的DataGridview,大家看下代碼

  ///

/// 創建表格 /// ///生成多少行數 private void CreateTable(int rows) { DataTable dt_Sale = new DataTable(); DataColumn dc = null; //線程ID dc = new DataColumn(); dc.ColumnName = "線程ID"; dc.DefaultValue = "1"; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //循環類型 dc = new DataColumn(); dc.ColumnName = "循環類型"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //當前循環次數 dc = new DataColumn(); dc.ColumnName = "當前循環次數"; dc.DefaultValue = " "; dc.DataType = Type.GetType(" System.String"); dt_Sale.Columns.Add(dc); //開始時間 dc = new DataColumn(); dc.ColumnName = "開始時間"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //結束時間 dc = new DataColumn(); dc.ColumnName = "結束時間"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //總用時(毫秒) dc = new DataColumn(); dc.ColumnName = "總用時(毫秒)"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); DataRow dr = dt_Sale.NewRow(); for (int i = 1; i < rows; i++) { dr["線程ID"] = i.ToString(); dr["循環類型"] = "For循環"; dr["當前循環次數"] = "0"; dr["開始時間"] = "00:00:00"; dr["結束時間"] = "00:00:00"; dr["總用時(毫秒)"] = "0"; dt_Sale.Rows.Add(dr); dr = dt_Sale.NewRow(); } dgvTextFor.DataSource = dt_Sale; }

  復制代碼

  5.定義一個方法用來訪問指定的網站就是我們的實際測試這塊,

  一起來看下代碼

  ///

/// 執行數據 /// ///線程號行號 ///循環總次數 private void PingTask(int dgvrowid, int number) { //獲取開始時間 DateTime st = DateTime.Now; //開始時間 this.BeginInvoke(_upDateStateDelegate, st.ToString("hh-mm-ss"), dgvrowid, "開始時間"); for (int i = 0; i < number; i++) { try { HttpHelps hh = new HttpHelps(); //自動訪問百度,主要是延長時間 hh.GetHttpRequestStringByNUll_Get("www.baidu.com", null); //當前循環次數 this.BeginInvoke(_upDateStateDelegate, i.ToString(), dgvrowid, "當前循環次數"); //獲取結束時間 DateTime et = DateTime.Now; //結束時間 this.BeginInvoke(_upDateStateDelegate, et.ToString("hh-mm-ss"), dgvrowid, "結束時間"); //總用時(毫秒) this.BeginInvoke(_upDateStateDelegate, ExecDateDiff(st, et), dgvrowid, "總用時(毫秒)"); } catch { } } }

  復制代碼

  我來解釋下這句 //總用時(毫秒) this.BeginInvoke(_upDateStateDelegate, ExecDateDiff(st, et), dgvrowid, "總用時(毫秒)");

  第一個BeginInvoke方法,是用來異步執行委托的,系統自帶方法。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97