如何使用backgroundworker实现登陆等待效果

LovingAlison 2009-07-30 12:16:50
winform C/S的程序 由于登陆要访问WebService服务器 耗时比较长

所以想实现一个等待的效果

现在放了一个来回滚动的gif图片在登陆界面上 默认隐藏
但是点击登录按钮后 设置该图片visiable属性为true的话 并没有显示出来
只有登录失败时候该图才显示出来


请问用 backgroundworker 如何实现该效果
...全文
424 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
LQknife 2009-07-30
  • 打赏
  • 举报
回复
感觉不太合适做登陆界面,因为你的下一步操作都等着登陆的成功与否
二backgroundworker最好用来获取数据时由于数据较大的情况,而主操作不受这些数据影响
lovvver 2009-07-30
  • 打赏
  • 举报
回复
把登陆的动作,不要放在主线程中做,那么你的窗体上的动画图片就可以时时看到了。
hecker728 2009-07-30
  • 打赏
  • 举报
回复

/*在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般
会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷
新界面上的进度条等显示元,必要进,还要控制后台线程中断当前操作。

以前,类似的应用会比较麻烦,需要写的代码较多,也很容易出现异常。在 .net中,提供了一个
组件 backgroundworker就是专门解决这个问题的。

使用这个组件其实非常简单,例如,我们做一个类似如下界面的进度条的小例子,在后台线程中进行
耗时运算,同时刷新界面上的滚动条和提示信息,运行结束后,弹出处理结果。



在界面上拖入backgroundWorker组件,并响应其三个事件。

代码如下:*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 多线程小例子
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//这里就是通过响应消息,来处理界面的显示工作

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.label1.Text = e.UserState.ToString();
this.label1.Update();
}

//这里是后台工作完成后的消息处理,可以在这里进行后续的处理工作。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("运算终于完成了");
}

//这里,就是后台进程开始工作时,调用工作函数的地方。你可以把你现有的处理函数写在这儿。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
work(this.backgroundWorker1);
}

//真正的处理工作

private bool work(BackgroundWorker bk)
{
int tatle =10000;

for (int i = 0; i < tatle; i++)
{
if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
{
bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
return false;
}

//处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
}
return true;
}

private void button2_Click(object sender, EventArgs e)
{

//用户要求取消时,就这样处理一下。有时不太灵喔。

this.backgroundWorker1.CancelAsync();
}

private void button1_Click(object sender, EventArgs e)
{

//这一句,就是让后台工作开始。

this.backgroundWorker1.RunWorkerAsync();
}

private void button3_Click(object sender, EventArgs e)
{
this.Close();
}
}
}




//一般的工作,就这样的套路处理一下,基本就可以工作了,如果多个线程之间还要交互,或是有共享数据
//等问题,.net C# 中还是提供 System.Threading.Thread 类,跟传统用法没什么大区别,也挺好用的。

marvelstack 2009-07-30
  • 打赏
  • 举报
回复
使用BackgroundWorker组件来处理很合适,我写了BackgroundWorker和完整的实例代码,楼主看了应该不会再有问题,
使用BackgroundWorker组件进行异步操作编程

http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx

lunasea0_0 2009-07-30
  • 打赏
  • 举报
回复
BackgroundWorker就是起了一个子线程。用RunWorkerAsync来启动这个子线程,在这个子线程里进行登陆验证。挂
BackgroundWorker.DoWork Event,完成结果设置给DoWorkEventArgs的Result.

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧