C# 多线程更新UI 求助

小宝软件- 2013-02-20 11:36:23
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();
}
...全文
390 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwww112233 2013-02-22
  • 打赏
  • 举报
回复
2楼说的对啊,要sleep
  • 打赏
  • 举报
回复
加锁。每次操作ProgressBar的时候lock一下 object obj = new object(); 委托的方法里 lock(obj) { 操作ProgressBar }
小宝软件- 2013-02-22
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
http://download.csdn.net/detail/caozhy/4832657
谢谢斑竹的例程。 单条线程 不会冲突 如果 是10条线程同时去 给ProgressBar 赋值呢?
threenewbee 2013-02-22
  • 打赏
  • 举报
回复
引用 10 楼 chencong5025 的回复:
引用 9 楼 caozhy 的回复:http://download.csdn.net/detail/caozhy/4832657 谢谢斑竹的例程。 单条线程 不会冲突 如果 是10条线程同时去 给ProgressBar 赋值呢?
我的代码可以确保不会。因为Control.Invoke都是在UI线程中执行的,不存在并发的问题。
yang406952967 2013-02-22
  • 打赏
  • 举报
回复
机器人 2013-02-21
  • 打赏
  • 举报
回复
没效果是因为你代码执行太快。直接就到10了。 另外起10个线程是怎么回事?太瞎了。 起一个线程,加上Thread.Sleep(1000) 就可以了。
机器人 2013-02-21
  • 打赏
  • 举报
回复
blwuer 2013-02-21
  • 打赏
  • 举报
回复
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();
         }
  • 打赏
  • 举报
回复
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(); }
threenewbee 2013-02-21
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/caozhy/4832657
游戏人间 2013-02-21
  • 打赏
  • 举报
回复


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);
小宝软件- 2013-02-21
  • 打赏
  • 举报
回复
引用 2 楼 fangxinggood 的回复:
没效果是因为你代码执行太快。直接就到10了。 另外起10个线程是怎么回事?太瞎了。 起一个线程,加上Thread.Sleep(1000) 就可以了。
set方法 是手误 修改后 效果是:等线程全部运行完(此时程序假死 所以不是运行太快 我调整到100 也一样 卡死知道100线程全结束 然后直接变成100) 一次性直接就变成10了
小宝软件- 2013-02-21
  • 打赏
  • 举报
回复
引用 5 楼 blwuer 的回复:
2楼说的对,只是想实现lable的text 从1 显示到10,一个线程就可以了,在线程中做一个循环并加上延时就可以了,将你的代码修改下: C# code?12345678910111213141516171819202122private void button1_Click ( object sender , EventArgs e ) { ……
我线程还有其他处理代码 用处就是线程处理完是成功还是错误 计数用的.所以需要10线程 set方法 是手误 修改后 效果是:等线程全部运行完 一次性直接就变成10了
铁拳 2013-02-21
  • 打赏
  • 举报
回复
set 这个方法都没调用过

110,572

社区成员

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

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

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