求一段死循环的c#多线程并发访问一个网址的代码
我是做PHP的,想做一下网站压力测试,可惜PHP不支持多线程,祥测试一下我的程序,能支撑1秒钟并发多少个请求;对java没有什么好感,C#不错,刚开始学,弄来弄去总是线程...
我是做PHP的,想做一下网站压力测试,可惜PHP不支持多线程,
祥测试一下我的程序,能支撑1秒钟并发多少个请求;
对java没有什么好感,C#不错,刚开始学,
弄来弄去总是线程正在运行或者结束,不能启动
跪求高手了。
这个程序用控制台程序做,不用winform;
问题补充:
还有,我看到 有些人写的程序 申明私有一个变量 int _a 在用
public int A{
get{
return _a;
}
set{
_a=value;
}
这东西有什么意义呢
} 展开
祥测试一下我的程序,能支撑1秒钟并发多少个请求;
对java没有什么好感,C#不错,刚开始学,
弄来弄去总是线程正在运行或者结束,不能启动
跪求高手了。
这个程序用控制台程序做,不用winform;
问题补充:
还有,我看到 有些人写的程序 申明私有一个变量 int _a 在用
public int A{
get{
return _a;
}
set{
_a=value;
}
这东西有什么意义呢
} 展开
展开全部
首先回答你的问题:
public int A{ get{ return _a; }set{_a=value;}}
这叫封装属性,可以在get或set里对值进行处理,比如这个值不能大于100
可以修改为:
set{if(value<=100){_a=value;}} 不用属性的话,每个调用_a的地方都要加这段代码,多麻烦
刚好做了一个类似的测试,比你的要求复杂一些,你自己看吧:
// 点击按钮,开始循环测试
private void button1_Click(object sender, EventArgs e)
{
textBox4.Text = string.Empty;
string testUrl = txtUrl.Text; // 测试地址
string postData = "killId=" + txtKillid.Text; // 测试的参数,要post的数据
int threadNum = int.Parse(txtThreadNum.Text); // 发起的线程数,每个线程为一个新的Session,你要无限的话,可以设置为int.MaxValue
int threadTime = 10; // 每个线程跑10次,这是用于要用同一个Session测试10次的情况
for (int i = 0; i < threadNum; i++)
{
string[] arr = { testUrl, postData, killTime, i.ToString() };
new Thread(Post).Start(arr); // 开始当前线程测试
}
}
public void Post(object arr)
{
string[] para = arr as string[];
string testUrl = para[0];
string postData = para[1];
int killTime = int.Parse(para[2]);
int threadNum = int.Parse(para[3]);
CookieContainer cookie = new CookieContainer();
while (killTime > 0)
{
HttpWebRequest request = WebRequest.Create(testUrl) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.CookieContainer = cookie;
byte[] bodyBytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bodyBytes.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bodyBytes, 0, bodyBytes.Length);
reqStream.Flush();
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)";
killTime--;
using (WebResponse response = request.GetResponse())
using (Stream sr = response.GetResponseStream())
using (StreamReader reader = new StreamReader(sr))
{
// 把网页返回的内容输出到TextBox中
SetText(textBox4,
threadNum + "," + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + ":" + reader.ReadToEnd());
}
cookie = request.CookieContainer;
Thread.Sleep(100);
}
}
/// <summary>
/// 用于线程里访问TextBox的线程委托
/// </summary>
/// <param name="tb"></param>
/// <param name="txt"></param>
private delegate void SetTextDelegate(TextBox tb, string txt);
private void SetText(TextBox tb, string txt)
{
if (!tb.InvokeRequired)
{
tb.Text += txt + "\r\n";
}else
{
SetTextDelegate de =SetText;
Invoke(de, tb, txt);
//de.Invoke(txt);
}
}
public int A{ get{ return _a; }set{_a=value;}}
这叫封装属性,可以在get或set里对值进行处理,比如这个值不能大于100
可以修改为:
set{if(value<=100){_a=value;}} 不用属性的话,每个调用_a的地方都要加这段代码,多麻烦
刚好做了一个类似的测试,比你的要求复杂一些,你自己看吧:
// 点击按钮,开始循环测试
private void button1_Click(object sender, EventArgs e)
{
textBox4.Text = string.Empty;
string testUrl = txtUrl.Text; // 测试地址
string postData = "killId=" + txtKillid.Text; // 测试的参数,要post的数据
int threadNum = int.Parse(txtThreadNum.Text); // 发起的线程数,每个线程为一个新的Session,你要无限的话,可以设置为int.MaxValue
int threadTime = 10; // 每个线程跑10次,这是用于要用同一个Session测试10次的情况
for (int i = 0; i < threadNum; i++)
{
string[] arr = { testUrl, postData, killTime, i.ToString() };
new Thread(Post).Start(arr); // 开始当前线程测试
}
}
public void Post(object arr)
{
string[] para = arr as string[];
string testUrl = para[0];
string postData = para[1];
int killTime = int.Parse(para[2]);
int threadNum = int.Parse(para[3]);
CookieContainer cookie = new CookieContainer();
while (killTime > 0)
{
HttpWebRequest request = WebRequest.Create(testUrl) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
request.CookieContainer = cookie;
byte[] bodyBytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bodyBytes.Length;
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bodyBytes, 0, bodyBytes.Length);
reqStream.Flush();
}
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)";
killTime--;
using (WebResponse response = request.GetResponse())
using (Stream sr = response.GetResponseStream())
using (StreamReader reader = new StreamReader(sr))
{
// 把网页返回的内容输出到TextBox中
SetText(textBox4,
threadNum + "," + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff") + ":" + reader.ReadToEnd());
}
cookie = request.CookieContainer;
Thread.Sleep(100);
}
}
/// <summary>
/// 用于线程里访问TextBox的线程委托
/// </summary>
/// <param name="tb"></param>
/// <param name="txt"></param>
private delegate void SetTextDelegate(TextBox tb, string txt);
private void SetText(TextBox tb, string txt)
{
if (!tb.InvokeRequired)
{
tb.Text += txt + "\r\n";
}else
{
SetTextDelegate de =SetText;
Invoke(de, tb, txt);
//de.Invoke(txt);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询