当前位置:编程学习 > C#/ASP.NET >>

C# 多线程更新UI 求助

Winform程序
 控件 Button1 Lable
想要实现目标 for 循环启动10线程 给每个线程传递一个int 序号  更新到lable上
效果就是  lable的text 从1 显示到10
 代码:
 无效果  求助。对Invoke 不甚了解。
private void button1_Click ( object sender , EventArgs e )
         {
             int i;
             for (  i = 0; i < 10; i++ )
             {
                 ThreadStart st=delegate{test(i);};
                 Thread t = new Thread(st);
                 t.Start();
             }
         }
         public void test (int a)
         {
             testInvoke aaa = new testInvoke(test);
             int c = a;
             this.Invoke(aaa , new object [] { c });
             //label1.Invoke(aaa,new object[]{a});
        }
         public delegate void testInvoke ( int b );
         public void set ( int a )
         {
             label1.Text = a.ToString();
         }
--------------------编程问答-------------------- msdn Control.Invoke --------------------编程问答-------------------- 没效果是因为你代码执行太快。直接就到10了。

另外起10个线程是怎么回事?太瞎了。

起一个线程,加上Thread.Sleep(1000) 就可以了。

--------------------编程问答-------------------- set 这个方法都没调用过 --------------------编程问答--------------------             int i;
            for (i = 0; i < 10; i++)
            {
                ParameterizedThreadStart st = delegate(object obj)
                {
                    test((int)obj);
                };
                Thread t = new Thread(st);
                t.Start(i);
            }


        public void test(object a)
        {
            testInvoke aaa = new testInvoke(set);
            this.Invoke(aaa, new object[] { a });
        }
        public delegate void testInvoke(int b);
        public void set(int a)
        {
            label1.Text = a.ToString();
        } --------------------编程问答-------------------- 2楼说的对,只是想实现lable的text 从1 显示到10,一个线程就可以了,在线程中做一个循环并加上延时就可以了,将你的代码修改下:

private void button1_Click ( object sender , EventArgs e )
         {
                 ThreadStart st=delegate{test(0);};
                 Thread t = new Thread(st);
                 t.Start();
         }
         public void test (int a)
         {
             int c = a;
             testInvoke aaa = new testInvoke(test);
             for(int i=0;i<10;i++)
             {
                 this.Invoke(aaa , new object [] { i });
                 //label1.Invoke(aaa,new object[]{a});
                 Thread.sleep(1000);
             }
        }
         public delegate void testInvoke ( int b );
         public void set ( int a )
         {
             label1.Text = a.ToString();
         }
--------------------编程问答--------------------
引用 5 楼 blwuer 的回复:
2楼说的对,只是想实现lable的text 从1 显示到10,一个线程就可以了,在线程中做一个循环并加上延时就可以了,将你的代码修改下:
C# code?12345678910111213141516171819202122private void button1_Click ( object sender , EventArgs e )         {      ……

我线程还有其他处理代码  用处就是线程处理完是成功还是错误  计数用的.所以需要10线程
set方法 是手误  修改后  
效果是:等线程全部运行完 一次性直接就变成10了 --------------------编程问答--------------------
引用 2 楼 fangxinggood 的回复:
没效果是因为你代码执行太快。直接就到10了。

另外起10个线程是怎么回事?太瞎了。

起一个线程,加上Thread.Sleep(1000) 就可以了。


set方法 是手误  修改后  
效果是:等线程全部运行完(此时程序假死 所以不是运行太快 我调整到100 也一样 卡死知道100线程全结束 然后直接变成100) 一次性直接就变成10了 --------------------编程问答--------------------


private void button1_Click ( object sender , EventArgs e )
         {
             int i;
             for (  i = 0; i < 10; i++ )
             {
                 ThreadStart st=delegate{test(i);};
                 Thread t = new Thread(st);
                 t.Start();
             }
         }
         public void test (int a)
         {
             testInvoke aaa = new testInvoke(test); //第1处错误:调用错误应为 set
             int c = a;
             this.Invoke(aaa , new object [] { c });
             //label1.Invoke(aaa,new object[]{a});
        }
         public delegate void testInvoke ( int b );
         public void set ( int a ) //第2处 应与第1处相同。
         {
             label1.Text = a.ToString();
         }


你代码写得有问题,我已经给你指出来了。
第1处  testInvoke aaa = new testInvoke(test);==》 testInvoke aaa = new testInvoke(set); --------------------编程问答-------------------- http://download.csdn.net/detail/caozhy/4832657 --------------------编程问答--------------------
引用 9 楼 caozhy 的回复:
http://download.csdn.net/detail/caozhy/4832657

谢谢斑竹的例程。

单条线程 不会冲突  如果 是10条线程同时去 给ProgressBar 赋值呢? --------------------编程问答-------------------- 加锁。每次操作ProgressBar的时候lock一下
object obj = new object();


委托的方法里
lock(obj)
{
操作ProgressBar

} --------------------编程问答-------------------- 2楼说的对啊,要sleep --------------------编程问答-------------------- --------------------编程问答--------------------
引用 10 楼 chencong5025 的回复:
引用 9 楼 caozhy 的回复:http://download.csdn.net/detail/caozhy/4832657
谢谢斑竹的例程。

单条线程 不会冲突  如果 是10条线程同时去 给ProgressBar 赋值呢?


我的代码可以确保不会。因为Control.Invoke都是在UI线程中执行的,不存在并发的问题。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,