当前位置:编程学习 > C#/ASP.NET >>

以前做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: 控制台程序  

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秒???????  
--------------------编程问答-------------------- 无责任猜想~
我来开始测试你的短跑吧~
开始
运动员 影分身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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,