日期:2014-05-18  浏览次数:21238 次

委托+线程实现超简单winform实时进度条 欢迎拍砖
一直搞ASP.NET没多少机会碰一碰多线程 这几天自己鼓捣了个实时更新的winform进度条控件(不是假的那种哦!) 使用者无需知道线程等相关知识 甚至连委托都不怎么需要知道 即可实现一个支持开始 暂停 继续 终止 再次开始的进度条效果
以下是调用方法
C# code

private void Start_Click(object sender, EventArgs e)  
        {  
            this.myProcessBar1.Task = this.Task;  
            this.myProcessBar1.Run();//开始工作线程 同时开始监听工作进度  
        }  
        //某个耗时操作 参数即当前进度  
        public void Task(ref float percentage)  
        {  
            int i = 0;  
            while (i < int.MaxValue )  
            {  
                i++;  
                percentage = i / (float)int.MaxValue;  
            }  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            this.myProcessBar1.Stop();//暂停进度条 同时也暂停工作线程  
        }  
  
        private void button2_Click(object sender, EventArgs e)  
        {  
            this.myProcessBar1.Resume();//继续进度条 同时继续工作线程  
        }  
  
        private void button3_Click(object sender, EventArgs e)  
        {  
            this.myProcessBar1.Abort();//终止工作进程  
        }  
  
        private void button4_Click(object sender, EventArgs e)  
        {  
            this.myProcessBar1.Run();//这边位重新启动进度条  
        }  


效果图如下

整体思路是用三个线程 即UI线程本身 工作线程 以及监听线程 监听线程实时获取工作线程的执行的情况 并负责更新UI 这里面有一个很大的问题就是如何实时获取工作线程的进度情况 这里就提出一种没有被验证是否可靠的但是现在来说算是可行的方案 即引用类型参数

由于引用类型参数在传值的时候传递的是本身 因此所有针对他的变化都可以被外部获取 但是为了保证该变量的安全 设计的时候将该变量作为控件 的私有字段 并对外开放只读属性 这样就保证了该变量不会被非工作线程所改变
源代码下载链接

------解决方案--------------------
谢谢分享.
------解决方案--------------------
探讨

囧 没人么~自己顶一下~

------解决方案--------------------
探讨

囧 没人么~自己顶一下~

------解决方案--------------------
顶、以后会用到吧、谢谢LZ
------解决方案--------------------
大哥线程状态也做一下判断啊。铛铛的错误...
------解决方案--------------------
backgroundworker,简单好用。
------解决方案--------------------
你那白白的进度条几乎和背景融为一体。。我以为只有一根黑色的棒子。。。
------解决方案--------------------
Thread+Invoke
也能达到这个效果