以前做b/s 刚学遇到Thread问题 测试你是不是高手
问题1: 查询50万数据 绑定DataGridView, 我想查询异步线程查询数据库时间 和UI绑定DataGridView时间 无废话 上代码
public delegate DataTable GetDataDelegate();
private void button1_Click(object sender, EventArgs e)
{
//异步
GetDataDelegate getDataDele = new GetDataDelegate(GetData);
getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), null);
}
private DataTable GetData()
{
string sql = @"select top 500000 * from testfenye ";
IDataAccess dao = DataAccessFactory.CreateDataAccess();
DataSet ds = dao.ExecuteDataset(sql);
return ds.Tables[0];
}
private void DataCallBack(IAsyncResult tag)
{
AsyncResult result = tag as AsyncResult;
GetDataDelegate dele = result.AsyncDelegate as GetDataDelegate;
Stopwatch sw = new Stopwatch();
sw.Start();
DataTable table = dele.EndInvoke(tag);
sw.Stop();
//this.Invoke + 匿名委托解决
this.Invoke(new MethodInvoker(() => { textBox1.Text += "数据查询完毕, 耗时" + sw.ElapsedMilliseconds / 1000 + "秒"; }));
Stopwatch sw1 = new Stopwatch();
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new MethodInvoker(delegate()
{
BindData(table);
}));
}
sw1.Stop();
this.Invoke(new MethodInvoker(() => { textBox1.Text += "绑定完毕, 耗时" + sw1.ElapsedMilliseconds / 1000 + "秒"; }));
}
private void BindData(DataTable table)
{
this.dataGridView1.DataSource = table;
}
2个时间都是0 很显然不对 高手解答
问题2: 控制台程序
输出10秒 ,
private static void SleepOne()
{
Thread.Sleep(10000);
}
private static void UsingEndInvoke()
{
MethodInvoker invoker = new MethodInvoker(SleepOne);
IAsyncResult tag = invoker.BeginInvoke(null, "pass some");
try
{
Stopwatch sw = new Stopwatch();
sw.Start();
invoker.EndInvoke(tag);
sw.Stop();
Console.WriteLine("SleepOne()方法耗时:" + sw.ElapsedMilliseconds/1000 + "秒");
}
}
问题 :控制台能输出 为啥问题1里 Winform 是0秒???????
--------------------编程问答-------------------- 无责任猜想~
我来开始测试你的短跑吧~
开始
运动员 影分身A 不动了 影分身B 在跑
结束 教练看到 影分身A 不动就停止计时
所以是0
简单来说,你确定Stopwatch可以测量多线程的使用时间? --------------------编程问答-------------------- getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), null);
当DataCallBack得到回调时,getDataDele已经执行完毕了。 --------------------编程问答-------------------- --------------------编程问答-------------------- getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), DateTime.Now);
private void DataCallBack(IAsyncResult tag)
{
DateTime startTime = (DateTime)tag.AsyncState;
var elapsed = DateTime.Now - startTime;
... --------------------编程问答--------------------
--------------------编程问答-------------------- 呵呵 --------------------编程问答-------------------- 楼主的帖子全是测试高手的,开眼界了
private void DataCallBack(IAsyncResult tag)
{
DateTime startTime = (DateTime)tag.AsyncState;
var elapsed = DateTime.Now - startTime;
AsyncResult result = tag as AsyncResult;
GetDataDelegate dele = result.AsyncDelegate as GetDataDelegate;
DataTable table = dele.EndInvoke(tag);
// textBox1.Text += "数据查询完毕, 耗时" + sw.ElapsedMilliseconds / 1000 + "秒"; //在此跨线程操作控件 不允许
// textBox1.Text += "开始UI绑定数据";
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new MethodInvoker(delegate()
{
BindData(table);
}));
}
this.Invoke(new MethodInvoker(() => { textBox1.Text += "数据查询完毕, 耗时" + elapsed.Milliseconds / 1000 + "秒"; }));
}
4楼方法 还是0 秒
补充:.NET技术 , C#