C# 多线程更新UI 求助
Winform程序控件 Button1 Lable
想要实现目标 for 循环启动10线程 给每个线程传递一个int 序号 更新到lable上
效果就是 lable的text 从1 显示到10
代码:
无效果 求助。对Invoke 不甚了解。
private void button1_Click ( object sender , EventArgs e )--------------------编程问答-------------------- msdn Control.Invoke --------------------编程问答-------------------- 没效果是因为你代码执行太快。直接就到10了。
{
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();
}
另外起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();
}
我线程还有其他处理代码 用处就是线程处理完是成功还是错误 计数用的.所以需要10线程
set方法 是手误 修改后
效果是:等线程全部运行完 一次性直接就变成10了 --------------------编程问答--------------------
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 --------------------编程问答--------------------
谢谢斑竹的例程。
单条线程 不会冲突 如果 是10条线程同时去 给ProgressBar 赋值呢? --------------------编程问答-------------------- 加锁。每次操作ProgressBar的时候lock一下
object obj = new object();
委托的方法里
lock(obj)
{
操作ProgressBar
} --------------------编程问答-------------------- 2楼说的对啊,要sleep --------------------编程问答-------------------- --------------------编程问答--------------------
我的代码可以确保不会。因为Control.Invoke都是在UI线程中执行的,不存在并发的问题。
补充:.NET技术 , C#