以前做b/s 刚学遇到Thread问题 测试你是不是高手

w87875251l 2013-09-18 11:57:37
问题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: 控制台程序

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 + "秒");
}
}
输出10秒 ,
问题 :控制台能输出 为啥问题1里 Winform 是0秒???????
...全文
268 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bonjour-你好 2013-09-26
  • 打赏
  • 举报
回复
楼主的帖子全是测试高手的,开眼界了
gomoku 2013-09-18
  • 打赏
  • 举报
回复
getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), DateTime.Now); private void DataCallBack(IAsyncResult tag) { DateTime startTime = (DateTime)tag.AsyncState; var elapsed = DateTime.Now - startTime; ...
jiaoshiyao 2013-09-18
  • 打赏
  • 举报
回复
gomoku 2013-09-18
  • 打赏
  • 举报
回复
getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), null); 当DataCallBack得到回调时,getDataDele已经执行完毕了。
moonwrite 2013-09-18
  • 打赏
  • 举报
回复
无责任猜想~ 我来开始测试你的短跑吧~ 开始 运动员 影分身A 不动了 影分身B 在跑 结束 教练看到 影分身A 不动就停止计时 所以是0 简单来说,你确定Stopwatch可以测量多线程的使用时间?
失落的神庙 2013-09-18
  • 打赏
  • 举报
回复
呵呵
w87875251l 2013-09-18
  • 打赏
  • 举报
回复

 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 秒  

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧