开门见山。最近遇到一个需求,一个winform程序,后台管理用的,有账号登录验证。在用户登录窗口点击登录按钮后,由于需要连接到远程服务器进行验证,因为网络问题有时候要等很长时间,这个时候用户就难受了,登陆界面一直在等待访问结果,所以经常性的一直卡在那里不动。好了,工作开始,着手解决这个问题。
我们知道,在Web编程中这种情况是很常见的,最通用的就是使用AJAX去处理,效果很好。但是在CS中我们应该如何去做呢? 多线程。这是最容易想到的方法,我也是用这个方法去解决的。
这里我使用了一个异步委托。利用BeginInvoke方法实现异步的调用。
第一步 ,定义一个登录操作的委托
delegate int LoginDelegate();
第二步,写两个方法,LoginBegin和LoginEnd,顾名思义,前者是登录验证的方法,就是我们前面所说的执行时间可能较长的代码段,后者就是Begin方法执行完毕后做的事情
/// <summary>
/// 登录请求开始
/// </summary>
/// <returns></returns>
int LoginBegin()
{
//这里写上你的登录方法
return 1;//如果成功就返回个1
}
/// <summary>
/// 登录请求结束
/// </summary>
/// <param name="result"></param>
void LoginEnd(IAsyncResult result)
{
AsyncResult asyncResult = (AsyncResult)result;
LoginDelegate login = (LoginDelegate)asyncResult.AsyncDelegate;
int loginresult = login.EndInvoke(result);
if(loginresult==1)
//成功了
else
//失败了
}
看到这里大家也许有点疑惑,IAsyncResult是哪里来的?下面就来说它
第三步,在点击登录按钮后执行委托(new LoginDelegate(LoginBegin)).BeginInvoke(LoginEnd, null);
这里是通过异步委托去调用了Begin方法,并且在Begin之行结束后调用End方法,刚刚的IAsyncResult其实就是Begin方法返回的值。
好了,简单三步,你就可以完成一个用户体验翻倍的登录。