问题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秒???????  

解决方案 »

  1.   

    无责任猜想~
    我来开始测试你的短跑吧~
    开始
    运动员 影分身A 不动了  影分身B 在跑
    结束 教练看到 影分身A 不动就停止计时
    所以是0 简单来说,你确定Stopwatch可以测量多线程的使用时间?
      

  2.   

    getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), null);当DataCallBack得到回调时,getDataDele已经执行完毕了。
      

  3.   

    getDataDele.BeginInvoke(new AsyncCallback(DataCallBack), DateTime.Now);private void DataCallBack(IAsyncResult tag)
    {
      DateTime startTime = (DateTime)tag.AsyncState;
      var elapsed = DateTime.Now - startTime;
      ...
      

  4.   


     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 秒