最近一直在学习线程相关的东西。在学习的过程中一边练习,看看线程的效果。
我在登陆界面的登录按钮中使用了异步委托,因为请求数据库服务是一个费时的过程,如果用单线程的话,在点登录后,界面就死掉了。因为要一直等待请求完毕,
代码如下:
private void radbtnLogin_Click(object sender, EventArgs e) { //去掉用户名和密码的首尾空格,保证数据的准确性 string userName = txtUserId.Text.Trim().ToUpper(); string userPwd = txtUserPwd.Text.Trim().ToLower(); if (userName ==string.Empty && userPwd == string.Empty) { return; } GetInfo d1 =UserLoginBLL.GetUserInfoBLL;//GetInfo是自定义委托 //异步获取用户登录信息 IAsyncResult ar = d1.BeginInvoke(userName , userPwd ,new AsyncCallback(ReturnInfo) , d1); }
我在用异步委托之后,使用了委托回调来获取登录信息,并用一个bool值得属性来判断是否登录成功
/// <summary> /// 异步调用回调方法 /// </summary> /// <param name="ar"></param> private void ReturnInfo(IAsyncResult ar) { LoginUserList = new List<PDA_USER>(); GetInfo dd = (GetInfo)ar.AsyncState; //GetInfo是自定义委托 LoginUserList= dd.EndInvoke(ar); if (LoginUserList.Count != 0) { //用来指示是否登录成功 IsUserLogin = true; //使用异步委托调用控件 //用这个来跨线程访问UI界面 MethodInvoker mi = new MethodInvoker(SetUIForm); BeginInvoke(mi); } else { MessageBox.Show("用户名和密码不匹配,请检查" , "提示" , MessageBoxButtons.OK , MessageBoxIcon.Error); } } //跨线程访问UI界面方法 private void SetUIForm() { this.Close();//关闭登录界面,在这之后会有主界面显示出来 }
同样,在登录界面上有一个"取消"按钮,我想实现的功能是,当在点"登录"之后点击"取消"按钮放弃这次请求或者让登录界面不关闭,同时不弹出主界面,这个功能我不知道该怎么实现。
用进度条+异步操作组件BackGroundWorker来实现。
花点时间了解一下。