[小工具] C#多线程|匿名委托传参数|测试网站压力--升级版
上次文章链接:http://www.sufeinet.com/thread-11-1-1.html写这些并不是不会用测试工具,也并不是无视测试工具,而是做为一个程序员希望用自己写的东西来完成一些功能,从而更深入的学习一下相关技术
而且这样的小工具,不是测试工具那样繁琐很方便 。
上次文章引言
我们一直在做网站,但在我河南这块,对测试工作,特别是压力测试一般都不怎么在意,都是自己访问一下速度不错就行了,再就是数据库访问速度测试也是同样情况
程序员在写Sql代码时,一般是一个人写完之后,一运行可快完事
其实这些是不够的,我们根本没有进行过多用户多线程的测试,如果是100个,一千个要同时访问,还会有这样的速度吗?
我们自己反思一下是不是有这样的经历呢,我做的网站刚上传服务器,打开很快,调数据库1000条以内一秒用不了,感觉非常好,但过了不几天,就会感觉到网站很慢很慢,于是去检查测试
其实这些可以提前做的,我下面来实现一个多线程测试网站访问速度的功能。
上次文章效果
<ignore_js_op>
说明:
1.一次可以开N多个线程;
2.可以设置要访问的地址;
3.可以设置要循环访问的次数;
相关技术点:
1.C# Winform;
2.httpHelper类;这是我之前自己写的一个类,大家可以参考一下(带证书,无视编码,设置代理等)
3.多线程;
4.线程之间的传参;
5.委托与匿名委托的使用方法;
接下来看看本次的效果吧,
<ignore_js_op>
其实是应在家的需求在原来的基础之上做了简单的修改,
源代码可以下载,大家自己修改吧
我就修改到这里,希望大家多多指教啊
下面的源代码
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类在打包文件里面有。
也可以参考我的文章[url=http://www.sufeinet.com/thread-3-1-1.html]http://www.sufeinet.com/thread-3-1-1.html[/url]
[小工具] C#多线程|匿名委托传参数|测试网站压力--升级版的更多相关文章
- C#多线程函数如何传参数和返回值
详见网站:http://WWW.MOVIH.COM就是一个多线程爬虫系统. C#多线程函数如何传参数和返回值 提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托 ...
- python自定义小工具:密码匿名化、毫秒时间显示、人类易读字节
import base64 import time def timestamp2datems(timestamp): ''' 时间戳转为日期字串,精确到ms.单位s :param timestamp: ...
- WordPress小工具开发教程(网站公告)
WordPress小工具开发教程(网站公告) BY TIANQIXIN · 2012 年 12 月 26 日 wordpress主题小工具,可以自由拖动到侧边栏,并在前台实现相应功能!一般自带的小 ...
- js 创建书签小工具之理论
我们一直在寻找增加浏览体验的方法,有的方法众所周知,有的则鲜为人知.我原本认为书签小工具属于后者,非常令人讨厌的东西.令我非常懊恼的是我发现在这个问题上我完全是错误的.它并不是令人厌烦的,而是以用户为 ...
- Confluence 6 注册单一小工具
如果你不能订阅一个应用的小工具,你需要将小工具一个一个的添加进来.针对网站不支持小工具订阅和你的应用和你的 Confluence 不能建立信任连接的情况,你就只能这样添加了. 首先你需要获得小工具的 ...
- Confluence 6 注册外部小工具
你可以从外部站点中注册小工具(Gadget)(例如 Jira 应用),你注册成功的小工具将会在 宏浏览器中显示出来,使用你 Confluence 站点的用户可以使用 Gadget Macro 来调用它 ...
- 写个C#命令行参数解析的小工具
最近测试工作做的比较多因此时常要创建一些控制台类型的应用程序.因为程序有不同的参数开关,需要在程序启动的时候通过命令行来给程序传递各种开关和参数.直接操作args有些不方便,所以就写了个解析参数的小工 ...
- 使用匿名委托,Lambda简化多线程代码
使用匿名委托,Lambda简化多线程代码 .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...
- JavaScript中匿名函数循环传参数(不触发函数的执行)
我们都知道定义函数的方式有两种,一种是函数声明,另一种是函数表达式,函数声明的语法是这样的: function functionName(arg0, arg1, arg2) { // 函数体 } 函数 ...
随机推荐
- jQuery学习笔记(9)--jquery中的事件--$(document).ready()
1.$(document).ready()方法是事件模块中最重要的一个函数,可以极大地提高web应用程序的相应速度. 2.执行时机:DOM就绪后就会执行,而javascript中window.onlo ...
- 连通性 保证f具有介值性质
- Swift 学习笔记 (函数)
函数 函数是一个独立的代码块,用来执行特定的任务.Swift中的函数与Object-C中的函数一样,但是声明与书写的方式不太一样,现在我们就通过几个例子介绍一下Swift中的函数.简单的来说,他与JS ...
- window窗口的各种宽高
一 常用的宽高属性 在日常开发的时候,我们常常需要用到这几个高度信息.浏览器的视口高度和宽度,浏览器的卷动高度,正文内容的总高度等等信息,我在下图中列出了在工作中最常用的几个宽度和高度信息.并在本篇文 ...
- SD相关的表
[转] 一.客户主数据基本数据放在KNA1里:公司代码放在KNB1里:销售视图放在KNVV里:合作伙伴放在KNVP里:二.信用主数据KNKK里有信贷限额.应收总额.特别往来:S066里是未清订单值:S ...
- Oracle数据库之SQL基础和分支循环
一.SQL基础语言 DECLARE --声明 a ); --变量或对象 BEGIN a:='小明';-- := 表示给一个变量赋值 dbms_output.put_line(a); --输出用 dbm ...
- 算法(Algorithms)第4版 练习 1.3.13
(a) 0 1 2 3 4 5 6 7 8 9 (b) 4 6 8 7 5 3 2 9 0 1 (c) 2 5 6 7 4 8 9 3 1 0 (d) 4 3 2 1 0 5 6 7 8 9 答案:b ...
- BZOJ 1201 [HNOI2005]数三角形:枚举 + 前缀和
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1201 题意: 有一个边长为n的正三角形网格,去掉其中一些线段,问你在这幅图中有多少个三角形 ...
- openfire XML流
XML流 概览 两个基本概念,XML流和XML节,使得在出席信息已知的实体之间,异步交换低负载的结构化信息成为可能.这两个术语定义如下: XML流的定义:一个XML流是一个容器,包含了两个实体之间通过 ...
- hls协议(最清晰的讲解)
今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...