多线程更新进度条的疑问

BenBenBears 2016-06-22 10:28:51

private Class A
{
private ProgressBar proBar;
public A(ProgressBar bar)
{
proBar = bar;
}


public void SaveImg()
{
//保存图片
Dowork();
}
private delegate void DoWorkDelegate();
public void DoWork()
{
if (proBar.InvokeRequired)
{
DoWorkDelegate d = DoWork;
proBar.Invoke(d);
}
else
{
proBar.Value++;
Application.DoEvents();
//if()
}
}
}
//在Button点击事件中循环实例化线程
for(int i =0 ; i<=1000 ; i++)
{
Thread DownLoadPicThread = new Thread(new ThreadStart(imgInfo.FormatImg));
DownLoadPicThread.Start();
}




问题:
1、DoWork函数执行proBar.Invoke(d)后会等所有的图片保存了之后再更新进度条proBar,为什么会这样。是因为实例太多的线程,没有空闲时间吗,还是因为其他的?谢谢!
...全文
229 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
proBar.Invoke(d); 改为 proBar.BeginInvoke(d); 试试呢
黑娃 2016-06-22
  • 打赏
  • 举报
回复
if (proBar.InvokeRequired) { DoWorkDelegate d = DoWork; proBar.Invoke(d); } else { proBar.Value++; Application.DoEvents(); //if() } 这样的写法还是第一次见,估计是让1000各线程委托ui线程来++proBar? 所有图片都保存了什么意思,没看见你有保存图片的代码啊,不知道进行起来到底是怎样的状况
BenBenBears 2016-06-22
  • 打赏
  • 举报
回复
Sorry Thread DownLoadPicThread = new Thread(new ThreadStart(imgInfo.FormatImg)); 更改为 A = new A(ProBar); Thread DownLoadPicThread = new Thread(new ThreadStart(A.SaveImg)); 实在抱歉!! @falcomavin @yuankaiwsl
巴士上的邂逅 2016-06-22
  • 打赏
  • 举报
回复
看不出Class A和Button Click事件有什么关系
黑娃 2016-06-22
  • 打赏
  • 举报
回复
那1000各线程运行的是啥?dowork还是递归的?啥意思啊,没看明白
BenBenBears 2016-06-22
  • 打赏
  • 举报
回复
置顶神器again
BenBenBears 2016-06-22
  • 打赏
  • 举报
回复
置顶神器
BenBenBears 2016-06-22
  • 打赏
  • 举报
回复
引用 9 楼 tcmakebest 的回复:
演示代码,参考一 [/code]
我去~这段代码和我后面写的好像,连函数命名都一样DownLoadPicThread 。

Thread.Sleep(new Random().Next(10000));
各个线程休眠一段时间,控制权好像也回不到主线程,因为线程太多了
BenBenBears 2016-06-22
  • 打赏
  • 举报
回复
Invoke 会阻塞子线程直至控制权重新交给主线程,而不断new 的线程一直占着控制权,直至保存完所有图片。 后来想,new那么多的线程多浪费资源呀,干脆交给线程池处理了,进度条的问题也得到解决啦。 对自己无语,一直都是知其然而不知其所以然呀,谢谢各位帮忙哈,结贴。 @falcomavin @yuankaiwsl @starfd @wawd74520
tcmakebest 2016-06-22
  • 打赏
  • 举报
回复
演示代码,参考一
namespace CSDemo.Test
{
    public partial class FormTest : Form
    {
        public FormTest()
        {
            InitializeComponent();
        }

        A a;

        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Value = 0;
            progressBar1.Maximum = 1000;

            a = new A(progressBar1);
            new Thread(() => {
                for (int i = 0; i < 1000; i++)
                {
                    Thread DownLoadPicThread = new Thread(new ThreadStart(a.SaveImg));
                    DownLoadPicThread.Start();
                }
            }).Start();
        }

        class A
        {
            private ProgressBar proBar;
            public A(ProgressBar bar)
            {
                proBar = bar;
            }
            public void SaveImg()
            {
                Thread.Sleep(new Random().Next(10000));
                //保存图片
                DoWork();
            }
            private delegate void DoWorkDelegate();
            public void DoWork()
            {
                if (proBar.InvokeRequired)
                {
                    DoWorkDelegate d = DoWork;
                    proBar.Invoke(d);
                }
                else
                {
                    proBar.Value++;
                    //Application.DoEvents();
                    //if()
                }
            }
        }
    }
}
失落的神庙 2016-06-22
  • 打赏
  • 举报
回复
proBar.Value++; Application.DoEvents(); 这里输出日志看看。

110,477

社区成员

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

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

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