C#多线程如何调用主线程创建的控件

AC-SC 2014-10-12 03:19:04
DEL pActive = new DEL((int x) => { lstInfo.Items.Add(x); });
System.Diagnostics.Stopwatch Tim = new System.Diagnostics.Stopwatch();
Action ActiveTime=new Action(()=>{txtPath.Text= Tim.Elapsed.ToString();});
Tim.Reset();
Tim.Start();
for (int i = 0; i < 1000; i++)
{

if (lstInfo.InvokeRequired)
{
lstInfo.Invoke(pActive, new object[] { i });
}
else
{
lstInfo.Items.Add(i);
}
}
if (txtPath.InvokeRequired)
{
txtPath.BeginInvoke(ActiveTime);
}
else
{
txtPath.Text = Tim.Elapsed.ToString();
}
Tim.Stop();

请问一下我这种方法有什么问题吗?怎么执行起来很慢,用了7秒钟的时间,求高手解答,DEL是一个委托
...全文
651 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2014-10-14
  • 打赏
  • 举报
回复
引用 18 楼 oSuiFengPiao1 的回复:
[quote=引用 17 楼 Z65443344 的回复:] 你可以做个变量控制,后台数据改变了多少次,才去执行一次刷新 或者后台数据先放到个全局变量里,用timer每秒显示一次最新的数值 而不是后台数据每变化一次,都要往前台控件给一次最新的值
哦,好的,谢了,还想请教你个问题,如果是数据查询的话,怎么才能显示查询进度[/quote] 用datareader可以。fill是不行的。
happy76819 2014-10-14
  • 打赏
  • 举报
回复
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 19 楼 Z65443344 的回复:
如果你的数据查询是一个SQL语句,返回一大堆查询结果,没办法显示进度 要么返回数据,要么没返回数据,到底需要多长时间能返回,那是不确定的 要么你设计成分多次查询,每次查询500条或1000条,然后根据总的数量来显示进度 要么干脆加个旋转的沙漏,告诉用户,正在查询,没有死机,就完了
好的谢谢你了,非常感谢
於黾 2014-10-13
  • 打赏
  • 举报
回复
如果你的数据查询是一个SQL语句,返回一大堆查询结果,没办法显示进度 要么返回数据,要么没返回数据,到底需要多长时间能返回,那是不确定的 要么你设计成分多次查询,每次查询500条或1000条,然后根据总的数量来显示进度 要么干脆加个旋转的沙漏,告诉用户,正在查询,没有死机,就完了
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 17 楼 Z65443344 的回复:
你可以做个变量控制,后台数据改变了多少次,才去执行一次刷新 或者后台数据先放到个全局变量里,用timer每秒显示一次最新的数值 而不是后台数据每变化一次,都要往前台控件给一次最新的值
哦,好的,谢了,还想请教你个问题,如果是数据查询的话,怎么才能显示查询进度
於黾 2014-10-13
  • 打赏
  • 举报
回复
你可以做个变量控制,后台数据改变了多少次,才去执行一次刷新 或者后台数据先放到个全局变量里,用timer每秒显示一次最新的数值 而不是后台数据每变化一次,都要往前台控件给一次最新的值
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 15 楼 Z65443344 的回复:
不是说加了进度条就会变快了 加了进度条,你要把乱七八糟的频繁显示都去掉啊 而且进度条只是显示个百分百,是个大概,你每秒刷新一次就足够了,不要每秒刷新1000次啊,那有用吗
哦。明白一点了,但是怎么控制让他每秒才刷新一次呢
於黾 2014-10-13
  • 打赏
  • 举报
回复
不是说加了进度条就会变快了 加了进度条,你要把乱七八糟的频繁显示都去掉啊 而且进度条只是显示个百分百,是个大概,你每秒刷新一次就足够了,不要每秒刷新1000次啊,那有用吗
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
用个progressbar显示进度信息 其实一般用个进度条就可以看进度了,只不过只能看到百分比 如果想做的好点,可以再加个按钮,显示详细,点了之后显示个richtextbox来显示详细的信息,还可以再隐藏回去 控制台程序运行的时候会不断的窗口上刷信息,那是因为它没有别的办法,只能这样做 而窗口程序,控件丰富,可以用各种形式来展现 用户关心详细信息,就给他看详细信息, 用户不关心,就隐藏掉,只记录到后台的一个结构里,等用户想看的时候再放到界面上去
我用了progressbar还是执行的很慢的,耗时很长
於黾 2014-10-13
  • 打赏
  • 举报
回复
用个progressbar显示进度信息 其实一般用个进度条就可以看进度了,只不过只能看到百分比 如果想做的好点,可以再加个按钮,显示详细,点了之后显示个richtextbox来显示详细的信息,还可以再隐藏回去 控制台程序运行的时候会不断的窗口上刷信息,那是因为它没有别的办法,只能这样做 而窗口程序,控件丰富,可以用各种形式来展现 用户关心详细信息,就给他看详细信息, 用户不关心,就隐藏掉,只记录到后台的一个结构里,等用户想看的时候再放到界面上去
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
你看各种下载软件的进度,没有数字一直不停的在跳动的,都是1秒变化一次 没有任何必要告知用户每一毫秒的处理信息,用户看不过来,也并不关心
引用 10 楼 u011672494 的回复:
[quote=引用 7 楼 oSuiFengPiao1 的回复:] [quote=引用 5 楼 jiangsheng 的回复:] Invoke是发个消息传委托到界面线程去处理……你这一下就发了上千个消息,当然慢了,难道线程切换不要时间的? 没事少和界面线程通讯,人眼一般看每秒24帧就够了。你后台更新比这更频繁的话先堆着,用户不需要那么频繁的更新。
引用 6 楼 Z65443344 的回复:
如果你要做动画,每秒24帧就足够了 如果你要显示数据,每秒更新个3-5次也足够足够了 每秒更新上千次,不管是图片还是文字,都完全没有必要
我要做的时一个数据处理的程序,想实时的显示数据处理进度,有什么好办发吗[/quote] 用个progressbar显示进度信息[/quote] 像这种怎么处理呢
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
你看各种下载软件的进度,没有数字一直不停的在跳动的,都是1秒变化一次 没有任何必要告知用户每一毫秒的处理信息,用户看不过来,也并不关心
 Action pAction = new Action(() => { ProBar.Maximum = 2000; });
                GUIControl ProBarControl = new GUIControl((int x) => ProBar.Value=x);
                int LoopCount = 1;
                if (ProBar.InvokeRequired)
                {
                    ProBar.BeginInvoke(pAction);
                }
                else
                {
                    ProBar.Maximum = 2000;
                }
                while (大于2000条数据)
                {
                   LoopCount++;
                    while (大于20条数据)
                    {
                       //每次写一条数据
                    }
                    if (ProBar.InvokeRequired)
                    {
                        ProBar.BeginInvoke(ProBarControl, new object[] { LoopCount });
                    }
                    else
                    {
                        ProBar.Value++;
                    }   
                }
有时想起 2014-10-13
  • 打赏
  • 举报
回复
引用 7 楼 oSuiFengPiao1 的回复:
[quote=引用 5 楼 jiangsheng 的回复:] Invoke是发个消息传委托到界面线程去处理……你这一下就发了上千个消息,当然慢了,难道线程切换不要时间的? 没事少和界面线程通讯,人眼一般看每秒24帧就够了。你后台更新比这更频繁的话先堆着,用户不需要那么频繁的更新。
引用 6 楼 Z65443344 的回复:
如果你要做动画,每秒24帧就足够了 如果你要显示数据,每秒更新个3-5次也足够足够了 每秒更新上千次,不管是图片还是文字,都完全没有必要
我要做的时一个数据处理的程序,想实时的显示数据处理进度,有什么好办发吗[/quote] 用个progressbar显示进度信息
於黾 2014-10-13
  • 打赏
  • 举报
回复
你看各种下载软件的进度,没有数字一直不停的在跳动的,都是1秒变化一次 没有任何必要告知用户每一毫秒的处理信息,用户看不过来,也并不关心
於黾 2014-10-13
  • 打赏
  • 举报
回复
所谓实时,你要正确理解它的含义 在允许的延时时间之内,就叫实时了 你想1ms都不差,那时间要求也太高了点 而且对于仅仅显示个进度来说,也根本没必要实时 1秒变化一次就足够看了
AC-SC 2014-10-13
  • 打赏
  • 举报
回复
引用 5 楼 jiangsheng 的回复:
Invoke是发个消息传委托到界面线程去处理……你这一下就发了上千个消息,当然慢了,难道线程切换不要时间的? 没事少和界面线程通讯,人眼一般看每秒24帧就够了。你后台更新比这更频繁的话先堆着,用户不需要那么频繁的更新。
引用 6 楼 Z65443344 的回复:
如果你要做动画,每秒24帧就足够了 如果你要显示数据,每秒更新个3-5次也足够足够了 每秒更新上千次,不管是图片还是文字,都完全没有必要
我要做的时一个数据处理的程序,想实时的显示数据处理进度,有什么好办发吗
於黾 2014-10-13
  • 打赏
  • 举报
回复
如果你要做动画,每秒24帧就足够了 如果你要显示数据,每秒更新个3-5次也足够足够了 每秒更新上千次,不管是图片还是文字,都完全没有必要
dd_zhouqian 2014-10-13
  • 打赏
  • 举报
回复
蒋晟 2014-10-12
  • 打赏
  • 举报
回复
Invoke是发个消息传委托到界面线程去处理……你这一下就发了上千个消息,当然慢了,难道线程切换不要时间的? 没事少和界面线程通讯,人眼一般看每秒24帧就够了。你后台更新比这更频繁的话先堆着,用户不需要那么频繁的更新。
AC-SC 2014-10-12
  • 打赏
  • 举报
回复
引用 3 楼 unearth 的回复:

//在构造函数加上这句话,允许跨线程访问组件,然后就不用Invoke了。
CheckForIllegalCrossThreadCalls = false;

但是用这个东西不安全啊,我就想知道我的代码问题出在哪
加载更多回复(3)

110,538

社区成员

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

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

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