问题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秒???????
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可以测量多线程的使用时间?
{
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 秒