|
本帖最后由 semonpic 于 2020-8-21 10:49 编辑
在开发上位机软件时,每次需要执行一些耗时操作,如下载数据,此时弹出个进度条提示界面来安抚用户狂躁的内心还是有必要的。为了简化此操作,基于 BackgroundWorker做了个简化的小类库。.NET Framwork 版本 4.5
WPF:
Winform:
使用方法
1.导入类库 Winform(AsyncLoadDialog.DLL AsyncLoadBase.dll) WPF(AsyncLoadDialog.WPF.dll AsyncLoadBase.dll)
2.创建一个继承AsyncLoad的方法,实现关键方法 Woker,在Worker 方法中实现你耗时操作,并在适当的时候报告进度,以便进度条更新。
下面是个示例。
class DemoAsyncLoad : AsyncLoad
{
public override void Worker(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
try
{
Thread.Sleep(1000);
backgroundWorker.ReportProgress(10, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(1000);
backgroundWorker.ReportProgress(20, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(1000);
backgroundWorker.ReportProgress(30, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(1000);
backgroundWorker.ReportProgress(40, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(1000);
//If User Cancel
if (backgroundWorker.CancellationPending)
{
backgroundWorker.ReportProgress(80, new ProcessResult() { ProcessState = eProcessState.Cancel });
return;
}
backgroundWorker.ReportProgress(90, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(1000);
backgroundWorker.ReportProgress(100, new ProcessResult() { ProcessState = eProcessState.Working });
Thread.Sleep(500);
//Work Compelete,Return By Set Content And ProcessState eProcessState.Compelete
backgroundWorker.ReportProgress(100, new ProcessResult() { ProcessState = eProcessState.Compelete, Content = "Loaded Data" });
}
catch
{
backgroundWorker.ReportProgress(100, new ProcessResult() { ProcessState = eProcessState.Fail, Content = "Error Msg" });
}
}
}
3. 用2中的Class 生成一个对象,把此对象交给AsyncLoadForm,然后ShowDialog弹窗,等待操作结果,如果正常结束,就取AsyncLoadForm的ReturnObj 作为操作的结果。
DemoAsyncLoad normalDemoAsyncLoad = new DemoAsyncLoad();
AsyncLoadForm asyncLoadForm = new AsyncLoadForm(normalDemoAsyncLoad);
asyncLoadForm.StartPosition = FormStartPosition.CenterScreen;
DialogResult res = asyncLoadForm.ShowDialog();
if (res == DialogResult.OK)
{
object loadedObj = asyncLoadForm.ReturnObj; //
//TODO
}
else
{
//TODO Load Fail
}
需要注意的几点:
1 进度需要在Worker 中上报,不然进度条没变化。
2.正常结束或者加载资源出现异常时,必须上报,不然弹窗就在那里死等了。
3.关于Cancel,可以在弹窗上点击Cancel,此时弹窗消失,但是有可能此时Worker里面加载资源的操作还没结束,
优雅的结束方式是在Worker 里面做 backgroundWorker.CancellationPending 检测,在适当时间退出。
4.vs2019 开发的,低版本打不开项目文件,但是项目代码较少,自己依据项目结构重建也可以。
库连接
源代码 https://github.com/semonpic/AsyncLoadDialog
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)
|