想用子线程控制窗体中一个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才显示,求教原因及解决方案!
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才显示,求教原因及解决方案!
把多线程处理部分封装到一个类中,该类向外提供处理进度的事件,
UI部分响应该事件
代码结构大致如下:
class Worker
{
Thread..
event ..
void Start()
{
//引发事件
}
}UI:
Worker work = new Worker();
work.onevent ++ ..void execevent()
{
Invoke(..);//在UI中响应线程引发的事件需要使用回调方式
}
private void ThreadProcess()
{
ProcessShow();
} private void ProcessShow()
{
if (this.panel3.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate { ProcessShow(); }));
return;
}
this.panel3.Show();
}
你把string serverdata = FileService.GetQueryData(UserName, PassWord, "上传日期", true, condition, folderKey, pagesize, 1, out toNum, out ds);
放在th线程里面.把 this.panel3.Show();
放在主线程里.
private void ThreadProcess()
{
MyInvoke mi = new MyInvoke(ProcessShow);
BeginInvoke(mi);
}
BeginInvoke相当于this.BeginInvoke,this是UI窗口的实例,所以,实际上,你的show还是在UI线程上执行的
正如benyouyong所说,调换一下位置,在子线程中读取数据,在UI线程中控制UI的元素