[小工具] 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) { // 函数体 } 函数 ...
随机推荐
- vsftp时间差8个小时的解决方法
$ vi /etc/vsftpd/vsftpd.conf use_localtime=YES ;
- 应用索引技术优化SQL 语句(转)
原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...
- JS性能优化——DOM编程
浏览器中的DOM 天生就慢 DOM是个与语言无关的API,它在浏览器中的接口却是用JavaScript实现的.客户端脚本编程大多数时候是在个底层文档打交道,DOM就成为现在JavaScript编码中 ...
- 微信小程序开发:学习笔记[3]——WXSS样式
微信小程序开发:学习笔记[3]——WXSS样式 快速开始 介绍 WXSS(WeiXin Style Sheets)是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果. WXSS ...
- Android 虚拟机 程序安装目录
Android应用安装涉及到如下几个目录:system/app系统自带的应用程序,无法删除.data/app用户程序安装的目录,有删除权限.安装时把apk文件复制到此目录.data/data存放应用程 ...
- clone和dup
ruby中clone和dup都是对一个对象的浅拷贝,其区别如下: 1.clone会拷贝单例方法,而dup不会. a = Object.new def a.hello "hello" ...
- PAT天梯赛 L2-020. 功夫传人 【DFS】
题目链接 https://www.patest.cn/contests/gplt/L2-020 思路 从师父开始 一层一层往下搜 然后 搜到 得道者 就更新答案 AC代码 #include <c ...
- 使用 eslint 和 editorconfig 规范代码
项目中使用eslint 为什么使用eslint : 为了保持代码风格的统一 在做vue项目的时候, 基本上都会使用 vue-cli 脚手架去创建一个vue 项目,里面可以选择使用eslint 代码检测 ...
- hadoop 安装配置
1.伪分布式搭建: 步骤参考: http://wenku.baidu.com/link?url=N_Sc7dqaO5HB47SmhntYZQI2tvvAjYt0mWT0fx28FDSMRYKTLUTc ...
- 51nod 1533 && CF538F
题目:难以简述,请传送门 神犇题解Ⅰ 神犇题解Ⅱ 好劲啊跪在地上..完全没接触过K叉树的性质.. 对于每个询问,我们并不关心叶节点,只关心其他的节点.而一个完整K叉树的内节点个数是O(n/k)的, ...