搜索
bottom↓
回复: 9

开源一个C#进度条弹窗提示的小类库,适用winform,wpf

[复制链接]

出0入0汤圆

发表于 2020-8-21 10:49:51 | 显示全部楼层 |阅读模式
本帖最后由 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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出5入0汤圆

发表于 2020-8-21 12:05:39 来自手机 | 显示全部楼层
?感谢分享

出0入0汤圆

发表于 2020-8-23 23:51:05 | 显示全部楼层
楼主,下载一个40K的文件,C#的下载时间是多少秒?

出0入0汤圆

 楼主| 发表于 2020-8-24 08:46:12 | 显示全部楼层
zw_7627 发表于 2020-8-23 23:51
楼主,下载一个40K的文件,C#的下载时间是多少秒?

啥意思,取决于服务器IO速度,和网络带宽

出0入0汤圆

发表于 2020-8-24 20:37:23 | 显示全部楼层
semonpic 发表于 2020-8-24 08:46
啥意思,取决于服务器IO速度,和网络带宽

谢谢,请问下winform本地下载烧写文件呢?

出0入0汤圆

发表于 2020-8-24 22:01:19 来自手机 | 显示全部楼层
感谢分享

出40入514汤圆

发表于 2020-8-24 22:15:41 | 显示全部楼层
zw_7627 发表于 2020-8-24 20:37
谢谢,请问下winform本地下载烧写文件呢?

这位小兄弟,你是连串口还是什么通信协议烧写呀,那就看具体通信波特率呀

出40入514汤圆

发表于 2020-8-24 22:21:09 | 显示全部楼层
自带的progressbar用着也挺好,能横能竖,也是自带光环动画效果

出0入0汤圆

发表于 2020-8-24 23:48:29 | 显示全部楼层
智涅 发表于 2020-8-24 22:15
这位小兄弟,你是连串口还是什么通信协议烧写呀,那就看具体通信波特率呀 ...

CAN 250k ,C#用 AutoResetEvent.wait(),40K的bin文件大约需要多久可以下载完?

出0入0汤圆

发表于 2020-8-24 23:48:59 | 显示全部楼层
智涅 发表于 2020-8-24 22:21
自带的progressbar用着也挺好,能横能竖,也是自带光环动画效果

用委托吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表