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


源代碼下載:http://www.sufeinet.com/thread-11-1-1.html

上次文章鏈接:http://www.cnblogs.com/sufei/archive/2012/01/12/2320430.html

寫這些並不是不會用測試工具,也並不是無視測試工具,而是做為一個程序員希望用自己寫的東西來完成一些功能,從而更深入的學習一下相關技術

而且這樣的小工具,不是測試工具那樣繁瑣很方便 。

上次文章引言


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

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

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

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

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

 

上次文章效果

 


 

 

 說明:

 

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

 

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

 

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

 

相關技術點:

 

          1.C# Winform;

 

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

 

          3.多線程;

 

          4.線程之間的傳參;

 

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

接下來看看本次的效果吧,

 

其實是應在家的需求在原來的基礎之上做了簡單的修改,

源代碼可以下載,大家自己修改吧

我就修改到這里,希望大家多多指教啊

下面的源代碼

View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Data.SqlClient;

namespace AutoFor
{
    public partial class TextFor : Form
    {
        private delegate void UpDateDgvDelegate(string msg, int rowId, string columnName);
        private UpDateDgvDelegate _upDateStateDelegate;
        public TextFor()
        {
            InitializeComponent();
            _upDateStateDelegate = new UpDateDgvDelegate(UpDateDgv);
        }

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

        /// <summary>
        /// 程序執行時間測試
        /// </summary>
        /// <param name="dateBegin">開始時間</param>
        /// <param name="dateEnd">結束時間</param>
        /// <returns>返回(秒)單位,比如: 0.00239秒</returns>
        public static string ExecDateDiff(DateTime dateBegin, DateTime dateEnd)
        {
            TimeSpan ts1 = new TimeSpan(dateBegin.Ticks);
            TimeSpan ts2 = new TimeSpan(dateEnd.Ticks);
            TimeSpan ts3 = ts1.Subtract(ts2).Duration();
            return ts3.TotalMilliseconds.ToString();
        }

        /// <summary>
        /// 執行數據
        /// </summary>
        /// <param name="dgvrowid"> 線程號行號</param>
        /// <param name="number">循環總次數</param>
        private void PingTask(int dgvrowid, int number, string url, int time)
        {
            //獲取開始時間
            DateTime st = DateTime.Now;

            //開始時間
            this.BeginInvoke(_upDateStateDelegate, st.ToString("hh-mm-ss"), dgvrowid, "開始時間");

            for (int i = 0; i < number; i++)
            {
                //獲取線程開始時間
                DateTime stThread = DateTime.Now;

                try
                {
                    HttpHelps hh = new HttpHelps();

                    //自動訪問百度,主要是延長時間
                    string strdate = hh.GetHttpRequestStringByNUll_Get(url, null);

                    //當前循環次數
                    this.BeginInvoke(_upDateStateDelegate, strdate, dgvrowid, "數據");

                    //當前循環次數
                    this.BeginInvoke(_upDateStateDelegate, (i+1).ToString(), dgvrowid, "當前循環次數");

                    //獲取結束時間
                    DateTime et = DateTime.Now;

                    //結束時間
                    this.BeginInvoke(_upDateStateDelegate, et.ToString("hh-mm-ss"), dgvrowid, "結束時間");

                    //總用時(毫秒)
                    this.BeginInvoke(_upDateStateDelegate, ExecDateDiff(st, et), dgvrowid, "總用時(毫秒)");
                    do
                    {
                        if (stThread.AddSeconds(time) <= DateTime.Now)
                        {
                            break;
                        }
                    } while (true);
                }
                catch { }
            }

        }

        /// <summary>
        /// 創建表格
        /// </summary>
        /// <param name="rows">生成多少行數</param>
        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);

            //測試數據
            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";
                dr["數據"] = "";
                dt_Sale.Rows.Add(dr);
                dr = dt_Sale.NewRow();
            }
            dgvTextFor.DataSource = dt_Sale;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int count = Convert.ToInt32(txtCount.Text.Trim());
            int number = Convert.ToInt32(txtNumber.Text.Trim());
            CreateTable(count + 1);
            //開啟number個線程
            for (int i = 0; i < count; i++)
            {
                Thread pingTask = new Thread(new ThreadStart(delegate
               {
                   PingTask(i, number, textBox1.Text.Trim(), Convert.ToInt32(txtForTime.Text.Trim()));
               }));
                pingTask.Start();
                Thread.Sleep(Convert.ToInt32(txtKtime.Text.Trim()) * 1000);
            }
        }
    }
}

 

里面所用的HttpHelps類在打包文件里面有。

也可以參考我的文章C# HttpHelper,Httprequest,請求時無視編碼,無視證書,無視Cookie,網頁抓取

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM