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);
}
}
}
}
太阳雨 发表于 2013-11-30 23:32
你有没有发现“开始间隔时间”根本没有发挥作用?
站长苏飞 发表于 2013-12-1 09:35
没有作用,那你取消看看,肯定是有效果的
站长苏飞 发表于 2013-12-1 09:35
没有作用,那你取消看看,肯定是有效果的
marcofly 发表于 2014-3-10 17:10
飞哥,我刚刚下载后试执行了下。
当点击“开始”的时候,界面会卡住呢。
正好要找C#多线程的例子学习下 ...
litian903sf 发表于 2014-3-12 12:40
刚刚测试了下,比如我设置了50个线程,每个线程间隔1S开启,好像是50S后50个线程一起并发提交的,有没办 ...
litian903sf 发表于 2014-3-12 14:40
现在遇到是测试要求是每分钟增加100用户的,不要绝对并发的。
Eagle 发表于 2014-7-10 18:02
非常棒,非常基础,但非常实用,不过鉴于这个多线程问题,我想追问一下飞哥了,如果界面更新频率太快了,怎 ...
qingyuan 发表于 2015-1-24 11:39
下载金钱哪里来的,怎么这么少。。
karima 发表于 2016-12-24 17:07
等待这些线程运行完再走下面的代码,这样要如何实现。
1229203497 发表于 2018-12-4 08:54
这样是没错 但是会出现界面卡死问题
欢迎光临 苏飞论坛 (http://www.sufeinet.com/) | Powered by Discuz! X3.4 |