当我们执行一项需长时间完成的查询操作,然后在窗体中显示一条消息.当使用同步数据访问,会发生窗体没反映的问题,解决的办法就是采用异步.
eg.
//button_Click 事件
{
SqlConnectionStringBuilder cnSettings;
cnSettings=new SqlConnectionStringBuilder("server=.;database=pubs; Integrated Security=True;Max pool Size=5;async=true;");
try
{cn.Open();
SqlCommand cmd=cn.CreateCommand();
cmd.CommandText="WaitFor Delay '00:00:15' Select @@Version";
cmd.BeginExecuteReader(new AsynCallback(ProcessResult),cmd);
}
finally
{
cn.Close();
}
private void ProcessResult(IAsyncResult ar)
{
SqlCommand cmd=(SqlCommand)ar.AsyncState;
using(cmd.Connection)
{
using(cmd)
{
string ver=null;
SqlDataReader rdr=cmd.EndExecuteReader(ar);
if(rdr.Read())
{
ver=(string)rdr[0];
label1.BeginInvoke(new labelHandler(UpdateLabel),ver);
}
}
}
}
public delegate void labelHandler(string text);
public void UpdateLabel(string text)
{
label1.Text=text;
}
//需要注意的是,在数据连接字段中,要设置async=true;
这样的话,窗口就不会出现不能操作的问题了.