c#winform UI多线程显示问题

dingli321 2010-08-19 03:41:02
想用子线程控制窗体中一个panel的显示,panel中有一个滚动条,看代码

Thread th = new Thread(new ThreadStart(ThreadProcess));
th.Start();
string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);

其中serverdata获取需要比较长的时间,我想在它之前先显示panel,ThreadProcess对应如下:

private void ThreadProcess()
{
MyInvoke mi = new MyInvoke(ProcessShow);
BeginInvoke(mi);
}

private delegate void MyInvoke();

private void ProcessShow()
{
this.panel3.Show();
}

我这样写应该没有问题吧,但是为什么还是在serverdata完全执行完成之后panel才显示,求教原因及解决方案!
...全文
349 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
facky904 2010-08-19
  • 打赏
  • 举报
回复
我觉得是这样的
private void ThreadProcess()
{
MyInvoke mi = new MyInvoke(ProcessShow);
BeginInvoke(mi);
}
BeginInvoke相当于this.BeginInvoke,this是UI窗口的实例,所以,实际上,你的show还是在UI线程上执行的
正如benyouyong所说,调换一下位置,在子线程中读取数据,在UI线程中控制UI的元素
superliu1122 2010-08-19
  • 打赏
  • 举报
回复
你虽然创建了一个新线程,但是显示面板的操作最终还是需要主线程中来进行,但这个时候主线程是阻塞的....

正确做法是:显示放在主线程,读取数据放在工作者线程
CGabriel 2010-08-19
  • 打赏
  • 举报
回复
用 BackgroundWorker 轻松简单快捷;比异步委托简单得多
skypaul888 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dingli321 的回复:]
是这样的,得到serverdata 后还得进行界面的更新操作呢!
[/Quote]
放到线程里不是同样可以更新界面吗?
dingli321 2010-08-19
  • 打赏
  • 举报
回复
没人知道了?
dingli321 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 benyouyong 的回复:]
调换下位置呗..
你把string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);
放在th线程里面.

把 this.panel3.Show();
放在主线程里.
[/Quote]
是这样的,得到serverdata 后还得进行界面的更新操作呢!
benyouyong 2010-08-19
  • 打赏
  • 举报
回复
调换下位置呗..
你把string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);
放在th线程里面.

把 this.panel3.Show();
放在主线程里.
dingli321 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 skypaul888 的回复:]
C# code

private void ThreadProcess()
{
ProcessShow();
}

private void ProcessShow()
{
if (this.panel3.InvokeRequired)
……
[/Quote]
哥们,还是不行啊,还是等数据全都刷新后才显示的!
skypaul888 2010-08-19
  • 打赏
  • 举报
回复

private void ThreadProcess()
{
ProcessShow();
}

private void ProcessShow()
{
if (this.panel3.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate { ProcessShow(); }));
return;
}
this.panel3.Show();
}
dingli321 2010-08-19
  • 打赏
  • 举报
回复
能详细点不?还有我那个方法为啥不能正常显示啊?
zhgroup 2010-08-19
  • 打赏
  • 举报
回复
用事件处理,
把多线程处理部分封装到一个类中,该类向外提供处理进度的事件,
UI部分响应该事件
代码结构大致如下:
class Worker
{
Thread..
event ..
void Start()
{
//引发事件
}
}

UI:
Worker work = new Worker();
work.onevent ++ ..

void execevent()
{
Invoke(..);//在UI中响应线程引发的事件需要使用回调方式
}
dingli321 2010-08-19
  • 打赏
  • 举报
回复
牛人帮忙啊!
csw535531988 2010-08-19
  • 打赏
  • 举报
回复
不懂,帮顶!!!!!!!!!!!

110,537

社区成员

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

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

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